
    4[g                         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Zd	 Zd
 Zd Z d Z!d Z"d Z#d Z$y)    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_OPTIONSc                    |i }nt        |      }|j                  t        j                  t        t        j                           }t        |      }|j                  t        j                  t        t        j                           }	t        |	      }	|j                  t        j                  t        t        j                           }
t        |
      }
|j                  t        j                  t        t        j                           }t        |      }t        j                  |v r!|t        j                     dk  rt        d      |j                  t        j                  t        t        j                           }t        |      }t        j                  |v r!|t        j                     dk  rt        d      |j                  t        j                  t        t        j                           }t        |      }|j                  t        j                  t        t        j                           }t        |      }t        |t               s|f}t#        | ||g| }t%        |d      s|g}t'        |      }t)        t+        ||            }t-        |      \  }}t/        |||      }t1        |||      }t3        |||||||	|
||||      }t5        ||j6                         t9        di |}|j:                  j<                  st?        |ddt@        jB                  d|      S |j6                  dk(  rt?        |ddt@        jD                  d|      S |rtG        d	       tG        d
|t        jH                      d       tG        d|t        jJ                      d       tG        d|t        jL                      d       tG        d|t        jN                      d       tG                	 tQ        |||      }d}d}d}d}d}d}	 ||t        jN                     k\  rt@        j`                  }nD|dz  }tb        jd                  jk                  |jl                  |jn                  jp                  jr                  z
        |tt        jv                     |jx                  z  k\  r|j{                  |       |jx                  }|j}                  |      \  } }!| |!z   }"tb        jd                  jk                  |"      }#|#|tt        j~                     |j                  z  k  r|xjx                  |tt        j                     z  c_<        ||j                  kD  rd}d}n|dz  }|dz  }|#d|j                  z  kD  rd}|dk\  xs |dk\  }$|$rd}d}d}%n	 |j                         \  }}&|&t        |jx                  |tt        j                     |j                  z        kD  }%n[|j                  |"      }'|'rC	 t        |||"|      \  }(})}*|j                  |jl                  |j                  |j                  |j                        }+|j                  |jl                  |"z   |(|)|*      },|j                  dk(  r|,|+kD  rtb        jd                  jk                  |       |tt        j                     dz  |jx                  z  kD  rL|j                  |"|      }-tb        jd                  jk                  |-      dkD  r|"|-z  }"	 t        |||"|      \  }(})}*|j                  |"|(|)|*      }.	 |j                  |jl                  |"z         d   }	 |jn                  j                  ||jl                  |"z   |(|)|*      }/|j                          |j                  |"|.       |jx                  |j                  k  r|.|tt        j                     k\  rd}n|dz  }|jn                  j                  |jl                        }0	 |jn                  j                  |jl                        }1tb        jd                  jk                  |0      |tt        j                     tb        jd                  jk                  |1      z  k  rd}|dk\  r	 |jn                  j                          d}|j                  |jl                  |"z          	 |j                         \  }}&|/xsO |.|tt        j                     k  xr7 |&t        |jx                  |tt        j                     |j                  z        kD  }%||j                  k  xr |.|tt        j                     k  xr |% }$nd}$d}%|$r|j                  |t        jJ                     k  rd}t@        j                  }n|j                  |       |j                          |r|j                  |jl                  |j                  |j                        }2t        d|j                   ||j                  |jl                        |j                  |2|j                  |       tG                |%rc	 |j                  ||      }"	 t        |||"|      \  }(})}*	 |jn                  j                  ||jl                  |"z   |(|)|*       |j                          lt?        ||j                  ||||      S # tR        $ r! t?        |ddt@        jT                  d|      cY S tV        $ r! t?        |ddt@        jX                  d|      cY S tZ        $ r! t?        |ddt@        j\                  d|      cY S t^        $ r! t?        |ddt@        j`                  d|      cY S tb        jd                  jf                  $ r! t?        |ddt@        jh                  d|      cY S w xY w# tb        jd                  jf                  $ r t@        jh                  }Y +w xY w# tR        $ r t@        jT                  }d}Y MtZ        $ r t@        j\                  }d}Y jtV        $ r t@        jX                  }d}Y t^        $ r t@        j                  }Y w xY w# tR        $ r t@        jT                  }d}Y tZ        $ r t@        j\                  }d}Y tV        $ r t@        jX                  }d}Y t^        $ r t@        j                  }Y w xY w# tb        jd                  jf                  $ r t@        jh                  }Y Mw xY w# tb        jd                  jf                  $ r t@        jh                  }Y w xY w# tb        jd                  jf                  $ r t@        jh                  }Y w xY w# tb        jd                  jf                  $ r t@        jh                  }Y w xY w# tb        jd                  jf                  $ r t@        jh                  }Y w xY w# tb        jd                  jf                  $ r t@        jh                  }Y Qw xY w# tR        $ r t@        jT                  }d}Y stZ        $ r t@        j\                  }d}Y tV        $ r t@        jX                  }d}Y t^        $ r t@        j                  }Y w xY w# tb        jd                  jf                  $ r t@        jh                  }Y w xY w)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.
            maxfev : int, optional
                Maximum number of function evaluations.
            maxiter : int, optional
                Maximum number of iterations.
            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.
            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.
            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`.
            radius_final : float, optional
                Final trust-region radius. It should indicate the accuracy
                required in the final values of the variables.
            nb_points : int, optional
                Number of interpolation points used to build the quadratic
                models of the objective and constraint functions.
            scale : bool, optional
                Whether to scale the variables according to the bounds.
            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.
            store_history : bool, optional
                Whether to store the history of the function evaluations.
            history_size : int, optional
                Maximum number of function evaluations to store in the history.
            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.

        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.
    increase_radius_factor : float, optional
        Factor by which the trust-region radius is increased when the reduction
        ratio is large.
    increase_radius_threshold : float, optional
        Threshold that controls the increase of the trust-region radius when
        the reduction ratio is large.
    decrease_radius_threshold : float, optional
        Threshold used to determine whether the trust-region radius should be
        reduced to the resolution.
    decrease_resolution_factor : float, optional
        Factor by which the resolution is reduced when the current value is far
        from its final value.
    large_resolution_threshold : float, optional
        Threshold used to determine whether the resolution is far from its
        final value.
    moderate_resolution_threshold : float, optional
        Threshold used to determine whether the resolution is close to its
        final value.
    low_ratio : float, optional
        Threshold used to determine whether the reduction ratio is low.
    high_ratio : float, optional
        Threshold used to determine whether the reduction ratio is high.
    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.
    penalty_increase_threshold : float, optional
        Threshold used to determine whether the penalty parameter should be
        increased.
    penalty_increase_factor : float, optional
        Factor by which the penalty parameter is increased.
    short_step_threshold : float, optional
        Factor used to determine whether the trial step is too short.
    low_radius_factor : float, optional
        Factor used to determine which interpolation point should be removed
        from the interpolation set at each iteration.
    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.
    threshold_ratio_constraints : float, optional
        Threshold used to determine which constraints should be taken into
        account when decreasing the penalty parameter.
    large_shift_factor : float, optional
        Factor used to determine whether the point around which the quadratic
        models are built should be updated.
    large_gradient_factor : float, optional
        Factor used to determine whether the models should be reset.
    resolution_factor : float, optional
        Factor by which the resolution is decreased.
    improve_tcg : bool, optional
        Whether to improve the steps computed by the truncated conjugate
        gradient method when the trust-region boundary is reached.

    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:  )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argsr7   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_normrn   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_vals3                                                      Q/var/www/html/bid-api/venv/lib/python3.12/site-packages/scipy/_lib/cobyqa/main.pyminimizer   $   s   b w-kk'//?7??+KLG7mGkk//0O O,OKKw}}'EFEKEKK--.M 'Mw&773G3G+HA+MDEE;;,,-L |$Lg%''2E2E*F!*KCDD++++,K k"KKKw}}'EFEKE dE"w
C%
7$
7C 2y!TWFk&&9:F 1A0M--165AF$%:GUKI 


B  "$$'&00I 99  ''
 	
 
$$
 	
 45-ggnn.E-FaHI+GGNN,C+DAFG6w''(),	
 	.ww7G7G/H.IKL3
GY7	j GFEML
 WW--..00F! IINN  9#3#3#A#A#H#HH 5569I9IIJ
 ""7+  &&'0'F'Fw'O$__,% 7789;O;OOP 	)*N*N OOY111 !%&"""a'"C)"6"666)*&!.!!3!N7IQ7N! !%&"#( &/&C&C&EOE8 $,c$$i99:**+/ $  (88>O05!	1-GWg. &OO$$&&&&&&		 &OO$$t+Wgw	 GG88!I-		{3	 > >?3F&&''  )IIg H yy~~h/#5("8= " ) $ '	95GWg. "55	%99!((4/E&/&6&6&K&Ky//$6'O ((* ''e4 ##y';';;	)*B*B CC'($)(//889I9IJ"'0'7'7'D'D ) 0 0(H 99>>$/)%;;3IINN8435 5 ,-L'1,& ) 0 0 = = ? ,-L )))*:*:T*AB&/&C&C&EOE8
 $ 	)*=*= >>  !((!)"="=>#../ !  9#7#77 -9+>+>!??-,, # &+"#(  ##ww~~'>>#22((1&&(HH$$i&8&8):L:L	 /	0D0D/EFJJy//0&&II   225'B,1"iw,O)'$
  55$$t+ $$&y | 
 q
  	
%%
 	
  	
''
 	
  	
''
 	
  	
''
 	
 99   	
##
 	
	
J yy,, '44F( % '66F"G& '88F"G& '88F"G# '88FF  - "%/%>%>F&*G!. "%/%@%@F&*G!. "%/%@%@F&*G!+ "%/%@%@F!"" yy,, '44F yy,, '44F&  "yy44 "%/%<%<F!" $&99#8#8 &)3)@)@ %& yy,, '44Fh 99(( #00 ! #22" #44" #44 #44 99(( #00s&  i? 8m  n p  !r ",r6 %s* t u v v: ',x1 ?'m(&m&m8&m :mm -nnp2pp,ppq?)q?q?#q?>q?-r32r36-s'&s'*-tt-uu-vv-v76v7:x.x.5x.x.-x.1-y"!y"c                    | Qt        t        j                  |t        j                         t        j                  |t        j                              S t	        | t               rE| j
                  j                  |fk7  s| j                  j                  |fk7  rt        d| d      | S t        | d      rKt        j                  |       } | j                  |dfk7  rt        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   rE   fullinfr.   lbshapeubr*   r0   asarray	TypeError)r7   r5   s     r   r2   r2   _  s     ~bgga"&&)2771bff+=>>	FF	#99??qd"fiioo!&=4QCzBCC		#F#<<Aq6!+  fQTlF1a4L11=
 	
    c           
      ,   t        | t              st        | d      s| f} g }g }| D ]h  }t        |t              rft	        |j
                  d      }t	        |j                  d      }|j                  t        |j                  gt        j                  ||              zt        |t              rft	        |j
                  d      }t	        |j                  d      }|j                  t        |j                  gt        j                  ||              t        |t              r`d|vs|d   dvrt        d      d	|vst        |d	         st        d
      |j                  |d	   |d   |j                  dd      d       `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".rv   z)The constraint function must be callable.rx   r    )rv   r_   rx   zrThe constraints must be instances of scipy.optimize.LinearConstraint, scipy.optimize.NonlinearConstraint, or dict.)r.   r!   r0   r   r   r   r   appendArE   broadcast_arraysr   rv   r*   callabler"   r   )ry   r   r   
constraintr   r   s         r   r3   r3   x  s    +t$GK,K"n !
j"23MB  MB %% LL((R0 
$78B  B "((#NN((R0 
D)Z':f+= F , !!NOOJ&hz%7H.I !LMM!((%e,&v.&NN626 ? g "p 444r   c                    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 rEt         j                  | v r3| t         j                     | t         j                     k  rEt        d      t         j                  | v rYt	        j
                  t        t         j                     | t         j                     g      | t         j                  j                  <   nt         j                  | v rYt	        j                  t        t         j                     | t         j                     g      | t         j                  j                  <   ndt        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  rt        d      t         j                  | v r=| t         j                     |dz   |dz   z  dz  kD  rt        d	|dz   |dz   z  dz   d
      | j                  t         j                  j                  t        t         j                     |             t        | t         j                           | t         j                  j                  <   t         j                  | v r!| t         j                     dk  rt        d      | j                  t         j                  j                  t	        j                  t        t         j                     |      | t         j                     dz   g             t        | t         j                           | t         j                  j                  <   t         j                  | v r!| t         j                     dk  rt        d      | j                  t         j                  j                  t        t         j                     |             t        | t         j                           | t         j                  j                  <   | j                  t         j                  j                  t        t         j                            t        | t         j                           | t         j                  j                  <   | j                  t         j                   j                  t        t         j                             t        | t         j                            | t         j                   j                  <   | j                  t         j"                  j                  t        t         j"                            t%        | t         j"                           | t         j"                  j                  <   | j                  t         j&                  j                  t        t         j&                            t%        | t         j&                           | t         j&                  j                  <   | j                  t         j(                  j                  t        t         j(                            t        | t         j(                           | t         j(                  j                  <   | j                  t         j*                  j                  t        t         j*                            t%        | t         j*                           | t         j*                  j                  <   | j                  t         j,                  j                  t        t         j,                            t        | t         j,                           | t         j,                  j                  <   | j                  t         j.                  j                  t        t         j.                            t%        | t         j.                           | t         j.                  j                  <   | D ]B  }|t         j0                  j3                         vs$t5        j6                  d| d
t8        d       D y)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>   rE   minr   valuerV   r&   NPT
setdefaultr+   r?   r@   TARGETr%   r#   r$   r'   r,   r(   r)   r-   __members__valueswarningswarnRuntimeWarning)r{   r5   keys      r   r4   r4     sT    ~~ WW^^%<%CLMM~~ WW^^%<s%BMNN~~ W^^w%>7>>"WW^^%<<B  
7	"(*/')
$$% 
7	"(*/')
$$% )8(G$$%(7(G$$%$)''..*A$BGGNN  !$)''..*A$BGGNN  !{{g''++"6!"; % & 	& 	wGKK QUq1u$5!#;;AQ1q5!a'(+
 	
 w{{((/'++*Fq*IJ!$WW[[%9!:GGKK7"ww/?/?'@A'EJ
 	
 
 0 01!4$q(	
 '*''2B2B*C&DGG""#7"ww/?/?'@A'EMNN(()!, '*''2B2B*C&DGG""#w~~++_W^^-LM$)''..*A$BGGNN  !%%//0 .3''(.GG##))* w,,ogoo.NO%)''//*B%CGGOO!!"w}}**OGMM,JK#'(>#?GGMM !!++, *-WW5H5H-I)JGG%%&##--. ,08M8M0N+OGG!!''("",,- +.gg6J6J.K*LGG  &&'w}}**OGMM,JK#'(>#?GGMM  g))0022MM,SE3^QG r   c                     t        |       }|j                  t        j                  j                  t
        t        j                            t        |t        j                           |t        j                  j                  <   |t        j                     dk  s|t        j                     dk\  rt        d      |j                  t        j                  j                  t
        t        j                            t        |t        j                           |t        j                  j                  <   |t        j                     dk  rt        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 rEt        j                  |v r3|t        j                     |t        j                     k\  rNt        d      t        j                  |v r_t        j                  t
        t        j                     dd|t        j                     z   z  g      |t        j                  j                  <   nt        j                  |v r\t        j                  t
        t        j                     d	|t        j                     z  g      |t        j                  j                  <   ndt
        t        j                     |t        j                  j                  <   t
        t        j                     |t        j                  j                  <   |j                  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                  |v r!|t        j                     dk  rt        d      t        j                   |v r!|t        j                      dk  rt        d      t        j                  |v rEt        j                   |v r3|t        j                      |t        j                     kD  rEt        d      t        j                  |v rYt        j                  t
        t        j                      |t        j                     g      |t        j                   j                  <   nt        j                   |v rYt        j                  t
        t        j                     |t        j                      g      |t        j                  j                  <   ndt
        t        j                     |t        j                  j                  <   t
        t        j                      |t        j                   j                  <   t        j"                  |v r7|t        j"                     dk  s|t        j"                     dk\  rt        d      t        j$                  |v r7|t        j$                     dk  s|t        j$                     dk\  rt        d      t        j"                  |v rEt        j$                  |v r3|t        j"                     |t        j$                     kD  rEt        d      t        j"                  |v rYt        j                  t
        t        j$                     |t        j"                     g      |t        j$                  j                  <   nt        j$                  |v rYt        j                  t
        t        j"                     |t        j$                     g      |t        j"                  j                  <   ndt
        t        j"                     |t        j"                  j                  <   t
        t        j$                     |t        j$                  j                  <   |j                  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(                  |v r!|t        j(                     dk  rt        d      t        j*                  |v r!|t        j*                     dk  rt        d      t        j(                  |v rEt        j*                  |v r3|t        j*                     |t        j(                     k  rEt        d      t        j(                  |v rYt        j                  t
        t        j*                     |t        j(                     g      |t        j*                  j                  <   nt        j*                  |v rYt        j                  t
        t        j(                     |t        j*                     g      |t        j(                  j                  <   ndt
        t        j(                     |t        j(                  j                  <   t
        t        j*                     |t        j*                  j                  <   |j                  t        j,                  j                  t
        t        j,                            t        |t        j,                           |t        j,                  j                  <   |t        j,                     dk  s|t        j,                     dk\  rt        d      |j                  t        j.                  j                  t
        t        j.                            t        |t        j.                           |t        j.                  j                  <   |t        j.                     dk  s|t        j.                     dk\  rt        d      |j                  t        j0                  j                  t
        t        j0                            t        |t        j0                           |t        j0                  j                  <   |t        j0                     dk  s|t        j0                     dk\  rt        d      |j                  t        j2                  j                  t
        t        j2                            t        |t        j2                           |t        j2                  j                  <   |t        j2                     dk  rt        d      |j                  t        j4                  j                  t
        t        j4                            t        |t        j4                           |t        j4                  j                  <   |t        j4                     dk  rt        d      |j                  t        j6                  j                  t
        t        j6                            t        |t        j6                           |t        j6                  j                  <   |t        j6                     dk  rt        d      |j                  t        j8                  j                  t
        t        j8                            t        |t        j8                           |t        j8                  j                  <   |t        j8                     dk  rt        d      |j                  t        j:                  j                  t
        t        j:                            t=        |t        j:                           |t        j:                  j                  <   | D ]B  }|t        j>                  jA                         vs$tC        jD                  d| dtF        d       D |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_THRESHOLDrE   r   rV   rT   LARGE_RESOLUTION_THRESHOLDMODERATE_RESOLUTION_THRESHOLDrl   
HIGH_RATIOrf   PENALTY_INCREASE_THRESHOLDPENALTY_INCREASE_FACTORrR   LOW_RADIUS_FACTORr`   THRESHOLD_RATIO_CONSTRAINTSrN   ri   rW   IMPROVE_TCGr$   r   r   r   r   r   )r|   r   r   s      r   r6   r6   %  sQ    VI((..)::; 9>)2239Ii..445 	)223s:Y556#=
 	
 ++11)==> <A)556<Ii11778 445<L
 	
 	((I5i6673>I
 	
 	++y8i99:cAL
 	
 	((I5//9< i99:99:; 4  
	)	)Y	6?Avv!)"E"EFsYy'G'GHHI@
	)55;;< 
	,	,		9<>FF!)"B"BCi	 C CDD=
	)22889 =N,,=
	)22889 iAAB 	)55;;<,,22)>>? =B)667=Ii22889 	)6673>Y99:cA
 	

 	,,	9i::;sBM
 	
 	//9<i==>#E
 	

 	,,	933y@ i==>	<<=> >  
	-	-	:CE66!)"I"IJ)>>?D
	)99??@ 
	0	0I	=@B!)"F"FG)AABA
	)66<<= iBBC 	)66<<= iEEF 	)99??@ i')%%&#-Y(()S0D
 	
 y()&&'3.Y))*c1E
 	
 i'I,@,@I,MY(()Ii6J6J,KKD  
				)02!)"6"67)--.1
	)&&,,- 
			*/1vv!)"5"56)../0
	)%%++, 0A0
	)%%++, 1B  1
	)&&,,-   &&)223 16)**+1Ii&&,,- 	)**+s2Y--.#5I
 	
 	,,	9i::;cA*
 	

 	))Y6i778C?J
 	
 	,,	9--: i778	<<=> . 
 
	-	-	:=?VV!)"C"CD)>>?>
	)3399: 
	*	*i	7@B!)"F"FG);;<A
	)66<<= iBBC 	)66<<= >O-->
	)3399: &&,,)889 7<)0017Ii,,223 	)001S8Y334;O
 	
 ##)))556 49)--.4Ii))//0 	)--.#5Y001S8L
 	
 &&,,)889 7<)0017Ii,,223 	)001S8Y334;O
 	
 --33)??@ >C)778>Ii3399: 6673>N
 	
 $$**)667 5:)../5Ii**001 --.4 ( ) 	)''--)99: 8=)1128Ii--334 001S8H
 	
 ##)))556 49)--.4Ii))//0 ,,-4D
 	
 ##)//0 .2)''(.Ii##))*
 i++2244MM.se15~qI  r   c                 h   | j                   |t        j                     k\  rt        |j                  |z   } | |      \  }}}| 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.
    )rs   r   r?   r   rJ   rp   r   r%   r   is_feasibilityr   )	r   r   r   r{   x_evalr   r   r   r_vals	            r   rY   rY   |  s     
yyGG,,--$F "6
GWgHHVWg.E77>>**WW4455	Ugg.E.E&FFGW$$r   c                 <   | j                  |      \  }}}|xr, t        j                  |      xr t        j                  |      }|t        j                  t        j
                  fvr|xr ||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	j!                  |d
      |	_        ||	_        |j&                  |	_        | j+                  |      |	_        ||	_        ||	_        | j2                  |	_        ||	_        |t        j8                     r"| j:                  |	_        | j<                  |	_        |t        j>                     rMtA        |	j"                  | |	j,                  |	j.                  |	j0                  |	j4                  |	j6                         |	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_evalrE   isfiniter   rA   rC   r   r%   r   rm   r;   rB   rZ   rD   r:   rH   r"   messager   r   r   rr   xrv   rp   rs   nfevnitr(   fun_historymaxcv_historyr#   rq   )
r   ru   r   r   r   r{   r   rv   rp   results
             r   r9   r9     s   
 LL)MAsEA"++c*Ar{{5/AGj//1L1LMMGeww/F/F'GGF!! $=!! $2   #0## &>## &@## &E## &5##%K!B!" 
c&'(# N$ FNLLFMzz!}FHFJFL))FKFJw$$%^^!// wNNHHJJLLKKJJ	
 Mr   c                 X   t                t        |  d       t        d| d       t        d| d       |j                  st        d|j                   d| d       t        d| d       t        j                  d	i t
        5  t        d| d       ddd       y# 1 sw Y   yxY w)
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_namerE   printoptionsr   )r   r   r   r   r   rs   r   s          r   rq   rq     s     
G	WIQ-	,VHA
67	"6(!
,-}Bwiq9:	*5'
34		)=	)%aS*+ 
*	)	)s   B  B))r    Nr    NN)%r   numpyrE   scipy.optimizer   r   r   r   r   r   problemr	   r
   r   r   r   utilsr   r   r   r   r   settingsr   r   r   r   r   r   r   r2   r3   r4   r6   rY   r9   rq   r    r   r   <module>r      s{       #    
xv
2B5JeHPTn
%&2j,r   