ó
    EñiöB  ã                   óœ   • 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_arrayÚ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          ÚZ/home/mande/repo/quber/.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à!-Ñ!9ŒC�Ô¸t€EØ%�Ø% e W¨B¨}¨o¸Qð@€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   € ä�8Š8�A‹;€DÜ	�Š˜XÓ	&Ü—'’'˜!™'Ó"¤9Ñ,ˆ‰÷ 
'à€H÷ 
'Ô	&à€Hús   «"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¢   € ð$Ø—|‘|“~Ñ&Ð&øÜó Ø‰ÒÜó $Ü×Ò¤Ó/ˆØ—n‘n ZÑ0×8Ñ8ˆÜˆw�z�l $ v hÐ.CÜ�G—L‘L“NÓ#Ð$Ð$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=ð =ˆäˆW”o°!Ò4ô .DØ)Ø+ä×.Ñ.×PÑPä×.Ñ.×NÑNä×.Ñ.×OÑOä×.Ñ.×UÑUØññ.Ð*ð :<Ñ6€A€tˆT�4˜˜v r¨;à�X‰X�]‰]‹_�F€Bˆä	�Š˜XÓ	&Ü—,’,˜tÓ$Ð$¤R§V¡VÑ+ˆ÷ 
'à€FØ€FØ€FÜ
�.Š.˜& &Ð)Ó
*€CÜ
�.Š.˜& &Ð)Ó
*€Cä�‡~�~œ $Ÿ™Ü�D˜$�<Ó ‰ä�IŠI�t˜T�lÓ#ˆÜ�!‹€AðØ�Hðà”×#Ñ#ðð 	�&ðð 	�jð	ð
 	œ_×AÑAðð 	%Ð&@ðð 	#Ð$<ðð 	˜$ðð 	˜ðð 	�tðð 	'Ð(Dðð 	,Ø2ðð 	œC×/Ñ/×DÑDðð 	˜wðð  	" 7ð!ð" 	�{ð#€Gð& ‡N�N�?Ô#ô �sÓ
€CÜ
�sÓ
€CÜ	�bÓ	€BÜ	�bÓ	€BàÑœbŸfšf [Ó1°QÓ6Ü—h’h˜q“k‰ä—h’h˜{Ó+ˆä
˜˜AŸH™H a§i¡i°·±¸¸cØ˜R ×!3Ñ!3´B·H±HÓ!=¸wóH€Cð �#ƒ~Ø�G‘ˆÜ�hŠh�uœS ›Y˜ZÐ(Ó)ˆÜ—’˜˜z¤ D£	Ð*Ó+‰à‰
ˆˆsð �3ƒØ�H‘ˆÜ—x’x  j¤s¨4£yÐ 1Ó2ˆÜ—X’X˜e¤C¨£I JÐ/Ó0ˆ
Ü—X’X˜c +Ñ.¨q²!¨tÑ4Ó5ˆ
Ü—X’X˜c +Ñ.¨q²!¨tÑ4Ó5‰
à#-Ñ ˆ�jØ!+Ñˆ
�Jð
 —7‘7˜8 TÓ*€LØ—G‘G˜I tÓ,€MÜ4°\Ø5BóD�O€FˆGð 	ˆC‰€AØØØÜ$Ø Ø(ñ&ó ô #ØØ&ñ$ó ô #Ø#$¡9™4°!°b±&Ø&ñ$ó ô #Ø#$¡9™4°"°q±&Ø&ñ$ó ð —'‘'˜%“.ØØ˜(‘mÔ'7×'@Ñ'@Ñ@ØØ—'‘'˜-¨Ó+×D¨s¯w©w°yÀ!Ó/DØŸG™G OÓ4ñ1€Cô6 
‡v‚vˆa‡y�y�[Ñ,Ø�
‰
Ø!Ÿg™gÐ&6¸Ó:Ø!Ÿg™gÐ&6¸Ó<Ø—w‘w˜y¨#Ó.ñ
ô 	ð €J÷c 
'Ö	&ú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÷õ ÷ 5Ñ 4ò'ò<ò$ð" :>Ø'+Ø.2Ø04Ø,0Ø59Ø#Ø!%õMr0   