
    e!h                         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.
                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:  )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                                                      ^/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/scipy/_lib/cobyqa/main.pyminimizer   $   s   F 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                 R   | Qt        t        j                  |t        j                         t        j                  |t        j                              S t	        | t               rc| j
                  j                  |fk7  s| j                  j                  |fk7  rt        d| d      t        | j
                  | j                        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   q  s     ~bgga"&&)2771bff+=>>	FF	#99??qd"fiioo!&=4QCzBCCfii++		#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     s    +t$GK,K"n ! 7
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7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     s[    ~~ 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   Hg))0022MM,SE3^QGH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   7  sX    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##))*
  Ji++2244MM.se15~qIJ r   c                 ~   | j                   |t        j                     k\  rt        |j                  |z   } | ||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.
    )rs   r   r?   r   rJ   ru   rp   r   r%   r   is_feasibilityr   )	r   r   r   r{   x_evalr   r   r   r_vals	            r   rY   rY     s     
yyGG,,--$F "69+<+< =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{       #    
JZ
2B5JeHPTn
%&2j,r   