
    (phB                         S r SSKrSSKrSSKJrJr  SSKJr  SSK	J
r
  SSKJrJrJrJrJr  SSKJrJrJr  S	 rS
 rS r        SS jrg)a^  HiGHS Linear Optimization Methods

Interface to HiGHS linear optimization software.
https://highs.dev/

.. versionadded:: 1.5.0

References
----------
.. [1] Q. Huangfu and J.A.J. Hall. "Parallelizing the dual revised simplex
           method." Mathematical Programming Computation, 10 (1), 119-142,
           2018. DOI: 10.1007/s12532-017-0130-5

    N   )OptimizeWarningOptimizeResult)warn)_highs_wrapper)	kHighsInfHighsDebugLevelObjSenseHighsModelStatussimplex_constants)
csc_matrixvstackissparsec                 p   0 SS_[         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R
                  S_[         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R                  S	_[         R                  S
_nSnUR!                  X5      u  pEU b  [#        U 5      OSnU SU SU S3nXE4$ )zCConverts HiGHS status number/message to SciPy status number/messageN)   z%HiGHS did not provide a status code. )r    )   r   )r   z&Optimization terminated successfully. )r   zTime limit reached. )r   zIteration limit reached. )r   zThe problem is infeasible. )   zThe problem is unbounded. )r   z(The problem is unbounded or infeasible. )r   z*The HiGHS status code was not recognized. z(HiGHS Status z: ))r   kNotset
kLoadErrorkModelErrorkPresolveErrorkSolveErrorkPostsolveErrorkModelEmptykObjectiveBoundkObjectiveTargetkOptimal
kTimeLimitkIterationLimitkInfeasible
kUnboundedkUnboundedOrInfeasiblegetint)highs_statushighs_messagescipy_statuses_messagesunrecognizedscipy_statusscipy_messagehstats          P/var/www/html/venv/lib/python3.13/site-packages/scipy/optimize/_linprog_highs.py_highs_to_scipy_status_messager/   "   s   F:F  'F 	##WF 	$$g	F
 	''F 	$$gF 	(('F 	$$gF 	(('F 	))7F 	!!#PF 	##%@F 	((*JF 	$$&HF 	##%FF  	// 2E!F$ EL##L?  L!-!9CtE%%eWB}oQ@M&&    c                     [         R                  " U 5      n[         R                  " SS9   [         R                  " X   5      [        -  X'   S S S 5        U $ ! , (       d  f       U $ = f)Nignoreinvalid)npisinferrstatesignr   )xinfss     r.   _replace_infr;   @   sJ    88A;D	X	&''!'"9, 
'H 
'	&Hs   "A
A&c                 :    X R                  5          $ ! [         a    X    s $ [         am    [        R                  " [
        5      nUR                  U   R                  n[        SU SU  S[        UR                  5       5       SU S3	[        SS9  X$   s $ f = f)NzOption z is z, but only values in z are allowed. Using default: .r   
stacklevel)lowerAttributeErrorKeyErrorinspect	signature_linprog_highs
parametersdefaultr   setkeysr   )option
option_strchoicessigdefault_strs        r.   _convert_to_highs_enumrO   H   s    $||~&&  $/nnZ088wzl$vh.CGLLN#$$A}A 	, ##$s    BA3BBc                 
   U(       a  SU S3n[        U[        SS9  [        U	S[        R                  R
                  [        R                  R                  [        R                  R                  [        R                  R                  SS.S9nU u  nnnnnnnnUR                  R                  5       u  nn[        R                  " S	S
9   [        R                  " U5      * [        R                  -  nSSS5        UnUnUn[        R                  " WU45      n[        R                  " UU45      n[!        U5      (       d  [!        U5      (       a  [#        UU45      nO[        R"                  " UU45      n[%        U5      n0 SU_S[&        R(                  _SU_SU_S[*        R,                  _SU_SU_SU_SU_SU_SU_SU_S[        R.                  R0                  _SU_SU_SU
_n U R3                  U5        [5        U5      n[5        U5      n[5        U5      n[5        U5      nUb  [        R6                  " U5      S:X  a  [        R8                  " S5      nO[        R:                  " U5      n[=        UUR>                  UR@                  URB                  UUUUURE                  [        RF                  5      U 5
      n!SU!;   aJ  U!S   n"[        R:                  " U"[I        U5      S 5      n#[        R:                  " U"S[I        U5       5      n"OSu  n"n#SU!;   a  U!S   n$[        R:                  " U$S[I        U5       5      n%[        R:                  " U$[I        U5      S 5      n&[        R:                  " U!S   SSS24   5      n'[        R:                  " U!S   SSS24   5      n(O
Su  n%n&Su  n'n(U!RK                  S S5      n)U!RK                  S!S5      n*[M        U)U*5      u  n+nU!S"   n,U,U"U#[O        U"U%S#.5      [O        U#U&S#.5      [O        U,c  SOU,U-
  U(S#.5      [O        U,c  SOUU,-
  U'S#.5      U!RK                  S$5      U+U!S    [P        RR                  :H  UU!RK                  S%S5      =(       d    U!RK                  S&S5      U!RK                  S'5      S(.n-[        RT                  " U,5      (       aH  UbE  U-R3                  U!RK                  S)S5      U!RK                  S*S+5      U!RK                  S,S+5      S-.5        U-$ ! , (       d  f       GN	= f).a  
Solve the following linear programming problem using one of the HiGHS
solvers:

User-facing documentation is in _linprog_doc.py.

Parameters
----------
lp :  _LPProblem
    A ``scipy.optimize._linprog_util._LPProblem`` ``namedtuple``.
solver : "ipm" or "simplex" or None
    Which HiGHS solver to use.  If ``None``, "simplex" will be used.

Options
-------
maxiter : int
    The maximum number of iterations to perform in either phase. For
    ``solver='ipm'``, this does not include the number of crossover
    iterations.  Default is the largest possible value for an ``int``
    on the platform.
disp : bool
    Set to ``True`` if indicators of optimization status are to be printed
    to the console each iteration; default ``False``.
time_limit : float
    The maximum time in seconds allotted to solve the problem; default is
    the largest possible value for a ``double`` on the platform.
presolve : bool
    Presolve attempts to identify trivial infeasibilities,
    identify trivial unboundedness, and simplify the problem before
    sending it to the main solver. It is generally recommended
    to keep the default setting ``True``; set to ``False`` if presolve is
    to be disabled.
dual_feasibility_tolerance : double
    Dual feasibility tolerance.  Default is 1e-07.
    The minimum of this and ``primal_feasibility_tolerance``
    is used for the feasibility tolerance when ``solver='ipm'``.
primal_feasibility_tolerance : double
    Primal feasibility tolerance.  Default is 1e-07.
    The minimum of this and ``dual_feasibility_tolerance``
    is used for the feasibility tolerance when ``solver='ipm'``.
ipm_optimality_tolerance : double
    Optimality tolerance for ``solver='ipm'``.  Default is 1e-08.
    Minimum possible value is 1e-12 and must be smaller than the largest
    possible value for a ``double`` on the platform.
simplex_dual_edge_weight_strategy : str (default: None)
    Strategy for simplex dual edge weights. The default, ``None``,
    automatically selects one of the following.

    ``'dantzig'`` uses Dantzig's original strategy of choosing the most
    negative reduced cost.

    ``'devex'`` uses the strategy described in [15]_.

    ``steepest`` uses the exact steepest edge strategy as described in
    [16]_.

    ``'steepest-devex'`` begins with the exact steepest edge strategy
    until the computation is too costly or inexact and then switches to
    the devex method.

    Currently, using ``None`` always selects ``'steepest-devex'``, but this
    may change as new options become available.

mip_max_nodes : int
    The maximum number of nodes allotted to solve the problem; default is
    the largest possible value for a ``HighsInt`` on the platform.
    Ignored if not using the MIP solver.
unknown_options : dict
    Optional arguments not used by this particular solver. If
    ``unknown_options`` is non-empty, a warning is issued listing all
    unused options.

Returns
-------
sol : dict
    A dictionary consisting of the fields:

        x : 1D array
            The values of the decision variables that minimizes the
            objective function while satisfying the constraints.
        fun : float
            The optimal value of the objective function ``c @ x``.
        slack : 1D array
            The (nominally positive) values of the slack,
            ``b_ub - A_ub @ x``.
        con : 1D array
            The (nominally zero) residuals of the equality constraints,
            ``b_eq - A_eq @ x``.
        success : bool
            ``True`` when the algorithm succeeds in finding an optimal
            solution.
        status : int
            An integer representing the exit status of the algorithm.

            ``0`` : Optimization terminated successfully.

            ``1`` : Iteration or time limit reached.

            ``2`` : Problem appears to be infeasible.

            ``3`` : Problem appears to be unbounded.

            ``4`` : The HiGHS solver ran into a problem.

        message : str
            A string descriptor of the exit status of the algorithm.
        nit : int
            The total number of iterations performed.
            For ``solver='simplex'``, this includes iterations in all
            phases. For ``solver='ipm'``, this does not include
            crossover iterations.
        crossover_nit : int
            The number of primal/dual pushes performed during the
            crossover routine for ``solver='ipm'``.  This is ``0``
            for ``solver='simplex'``.
        ineqlin : OptimizeResult
            Solution and sensitivity information corresponding to the
            inequality constraints, `b_ub`. A dictionary consisting of the
            fields:

            residual : np.ndnarray
                The (nominally positive) values of the slack variables,
                ``b_ub - A_ub @ x``.  This quantity is also commonly
                referred to as "slack".

            marginals : np.ndarray
                The sensitivity (partial derivative) of the objective
                function with respect to the right-hand side of the
                inequality constraints, `b_ub`.

        eqlin : OptimizeResult
            Solution and sensitivity information corresponding to the
            equality constraints, `b_eq`.  A dictionary consisting of the
            fields:

            residual : np.ndarray
                The (nominally zero) residuals of the equality constraints,
                ``b_eq - A_eq @ x``.

            marginals : np.ndarray
                The sensitivity (partial derivative) of the objective
                function with respect to the right-hand side of the
                equality constraints, `b_eq`.

        lower, upper : OptimizeResult
            Solution and sensitivity information corresponding to the
            lower and upper bounds on decision variables, `bounds`.

            residual : np.ndarray
                The (nominally positive) values of the quantity
                ``x - lb`` (lower) or ``ub - x`` (upper).

            marginals : np.ndarray
                The sensitivity (partial derivative) of the objective
                function with respect to the lower and upper
                `bounds`.

        mip_node_count : int
            The number of subproblems or "nodes" solved by the MILP
            solver. Only present when `integrality` is not `None`.

        mip_dual_bound : float
            The MILP solver's final estimate of the lower bound on the
            optimal solution. Only present when `integrality` is not
            `None`.

        mip_gap : float
            The difference between the final objective function value
            and the final dual bound, scaled by the final objective
            function value. Only present when `integrality` is not
            `None`.

Notes
-----
The result fields `ineqlin`, `eqlin`, `lower`, and `upper` all contain
`marginals`, or partial derivatives of the objective function with respect
to the right-hand side of each constraint. These partial derivatives are
also referred to as "Lagrange multipliers", "dual values", and
"shadow prices". The sign convention of `marginals` is opposite that
of Lagrange multipliers produced by many nonlinear solvers.

References
----------
.. [15] Harris, Paula MJ. "Pivot selection methods of the Devex LP code."
        Mathematical programming 5.1 (1973): 1-28.
.. [16] Goldfarb, Donald, and John Ker Reid. "A practicable steepest-edge
        simplex algorithm." Mathematical Programming 12.1 (1977): 361-371.
zUnrecognized options detected: z). These will be passed to HiGHS verbatim.r   r>   !simplex_dual_edge_weight_strategyN)dantzigdevexzsteepest-devexsteepestN)rL   r2   r3   presolvesensesolver
time_limithighs_debug_leveldual_feasibility_toleranceipm_optimality_tolerancelog_to_consolemip_max_nodesoutput_flagprimal_feasibility_tolerancesimplex_strategyipm_iteration_limitsimplex_iteration_limitmip_rel_gapr   slack)NNlambda	marg_bndsr   statusmessager9   )residual	marginalsfunsimplex_nitipm_nitcrossover_nit)r9   rd   conineqlineqlinr@   upperrk   rg   successrh   nitrn   mip_node_countmip_dual_boundg        mip_gap)ru   rv   rw   )+r   r   rO   s_cSimplexEdgeWeightStrategy!kSimplexEdgeWeightStrategyDantzigkSimplexEdgeWeightStrategyDevex kSimplexEdgeWeightStrategyChoose&kSimplexEdgeWeightStrategySteepestEdgeTcopyr5   r7   	ones_likeinfconcatenater   r   r   r
   	kMinimizer	   kHighsDebugLevelNoneSimplexStrategykSimplexStrategyDualupdater;   sumemptyarrayr   indptrindicesdataastypeuint8lenr%   r/   r   r   r   any).lprW   rX   rU   dispmaxiterrZ   r_   r[   rQ   rc   r]   unknown_optionsrh   &simplex_dual_edge_weight_strategy_enumcA_ubb_ubA_eqb_eqboundsx0integralitylbublhs_ubrhs_ublhs_eqrhs_eqlhsrhsAoptionsresrd   ro   lamdamarg_ineqlin
marg_eqlin
marg_upper
marg_lowerr'   r(   rg   r9   sols.                                                 r.   rE   rE   Y   s   J 4_4E F= =Wo!4 .D)+..PP..NN..OO..UU.* :<6AtT4vr;XX]]_FB	X	&,,t$$RVV+ 
'FFF
..&&)
*C
..&&)
*C~~$D$< IItTl#1AH## 	& 	j	
 	_AA 	%&@ 	#$< 	$ 	 	t 	'(D 	,2 	C//DD 	w  	"7!" 	{#G& NN?# s
C
s
C	b	B	b	Bbff[1Q6hhqkhh{+
AHHaiicR!3!3BHH!=wHC #~GhhuSYZ()zD	*+
s 3Hxxjs4y 12XXeCIJ/0
XXc+.q!t45
XXc+.q!t45
#- j!+
J
 778T*LGGIt,M4\5BDOFG 	CA$ (&  #&$  ##$94!b&&$  ##$94"q&&$  ''%.(m'7'@'@@''-+Dswwy!/DGGO41C6 
vvayy[,

!gg&6:!gg&6<wwy#.
 	 Jc 
'	&s   
)S55
T)
NTFNNNNNNN)__doc__rC   numpyr5   	_optimizer   r   warningsr   _highspy._highs_wrapperr   _highspy._corer   r	   r
   r   r   rx   scipy.sparser   r   r   r/   r;   rO   rE    r0   r.   <module>r      s\      6  3  6 5'<$" :>'+.204,059#!%Mr0   