
    gL                     t    d dl mZ d dlmZ ddlmZmZmZmZ d dl	Z	ddl
mZ  G d d	e      Z G d
 de      Zy)    )inf)List   )LpSolverLpSolver_CMD
subprocessPulpSolverErrorN   )	constantsc                   j    e Zd ZU dZd Zeed<   dZeed<   	 	 	 	 	 	 	 	 	 	 	 ddZ	d Z
d Zd	 Zd
 Zd Zy)	HiGHS_CMDzThe HiGHS_CMD solvernamer   SOLUTION_STYLENc                 F    t        j                  | |||||||||	|
|       y)a  
        :param bool mip: if False, assume LP even if integer variables
        :param bool msg: if False, no log is shown
        :param float timeLimit: maximum time for solver (in seconds)
        :param float gapRel: relative gap tolerance for the solver to stop (in fraction)
        :param float gapAbs: absolute gap tolerance for the solver to stop
        :param list[str] options: list of additional options to pass to solver
        :param bool keepFiles: if True, files are saved in the current directory and not deleted after solving
        :param str path: path to the solver binary (you can get binaries for your platform from https://github.com/JuliaBinaryWrappers/HiGHS_jll.jl/releases, or else compile from source - https://highs.dev)
        :param int threads: sets the maximum number of threads
        :param str logPath: path to the log file
        :param bool warmStart: if True, the solver will use the current value of variables as a start
        )mipmsg	timeLimitgapRelgapAbsoptionspath	keepFilesthreadslogPath	warmStartN)r   __init__)selfr   r   r   r   r   r   r   r   r   r   r   s               P/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/pulp/apis/highs_api.pyr   zHiGHS_CMD.__init__.   s6    6 		
    c                 $    | j                  d      S )Nhighs)executableExtensionr   s    r   defaultPathzHiGHS_CMD.defaultPathX   s    ''00r   c                 8    | j                  | j                        S )True if the solver is available)
executabler   r#   s    r   	availablezHiGHS_CMD.available[   s    tyy))r   c                    | j                  | j                        st        d| j                  z         |j                          | j	                  |j
                  ddddd      \  }}}}}|j                  |d       g }|j                  d	|        |j                  d
       |j                  dt        j                          | j                  s|j                  d       d| j                  v r!|j                  d| j                  d           d| j                  v r!|j                  d| j                  d           d| j                  v r!|j                  d| j                  d           d| j                  v r| j                  d   }n|}|j                  d|        g }	|	j                  | j                         |	j                  |       |	j                  d|        | j                  |	j                  d| j                          | j                  s|	j                  d       d| j                  v r|	j                  d       | j                  j                  dd      r&| j                  ||       |	j                  d|        t!        | j"                        }
|
D ]K  }d|vr|dt%        |
       z  }|j'                  d      r|	j                  |       ;|j                  |       M t)        |d      5 }|j+                  d j-                  |             ddd       t/        j0                  |	dd!      }|j3                         d"k(  rt        d#| j                  z         t)        |d$      5 }|j5                         }ddd       D cg c]   }|j7                         j9                         " }}|D cg c]  }|dd% d&d'gk(  s| }}t;        |      d(kD  rd)j-                  |d(   d*d       }n,|D cg c]	  }d+|v s| c}d(   }d)j-                  |d,d       }|D cg c]  }|dd% d-d'gk(  s| }}t;        |      d(kD  r|d(   nd.g}|d"   }|j=                         d/k(  r!t>        j@                  t>        jB                  }}n|j=                         d0k(  r!t>        j@                  t>        jD                  }}n|j=                         d1k(  r!t>        jF                  t>        jH                  }}nT|j=                         d2k(  r!t>        jJ                  t>        jL                  }}n t>        jN                  t>        jP                  }}tR        j                  jU                  |      r"tS        jV                  |      jX                  d(k(  rt>        jP                  }d}nE|t>        jP                  t>        jH                  t>        jL                  hv rd}n| j[                  |      }| j]                  |||||       |j_                  ||       |t>        j@                  k(  r|ja                  |       |S # 1 sw Y   xY w# 1 sw Y   xY wc c}w c c}w c c}w c c}w )3"Solve a well formulated lp problemzPuLP: cannot execute mpssolHiGHS	HiGHS_logmstT)with_objsensezsolution_file=zwrite_solution_to_file=truezwrite_solution_style=zlog_to_console=falser   zthreads=r   zmip_rel_gap=r   zmip_abs_gap=r   z	log_file=z--options_file=Nz--time_limit=z--solver=simplexz--parallel=onr   Fz--read_solution_file==-w
)stdoutstderrz@Pulp: Error while executing HiGHS, use msg=True for more detailsrr
   Modelstatusr       Statusr   Solutionz
Not solvedoptimalfeasible
infeasible	unbounded)1r'   r   r	   checkDuplicateVarscreate_tmp_filesr   writeMPSappendr   r   r   optionsDictr   r   getwritesoliterr   next
startswithopenwritejoinr   Popenwait	readlinesstripsplitlenlowerr   LpStatusOptimalLpSolutionOptimalLpSolutionIntegerFeasibleLpStatusInfeasibleLpSolutionInfeasibleLpStatusUnboundedLpSolutionUnboundedLpStatusNotSolvedLpSolutionNoSolutionFoundosexistsstatst_sizereadsoldelete_tmp_filesassignStatusassignVarsVals)r   lptmpMpstmpSol
tmpOptionstmpLogtmpMstfile_optionshighs_log_filecommandr   optionoptions_fileprocesslog_filelinesline
model_linemodel_statussol_line
sol_statusr:   
status_solvaluess                           r   actualSolvezHiGHS_CMD.actualSolve_   s   tyy)!"9DII"EFF
595J5JGGUE7K6
2
FF 	F$/"$nVH569:3I4L4L3MNOxx 67((((4+;+;I+F*G HIt''',t/?/?/I.J KLt''',t/?/?/I.J KL(((!--i8N#Ni'789tyy!v56>>%NN]4>>*:;<xxNN-.(((NN?+U3MM&"%NN26(;<t||$ 		,F& Ad7m_--   %v&##F+		, *c" 	8ltyy67	8 ""74E <<>R!R)) 
 .#& 	)(&&(E	)278$##%88 (-PtRaWh<O0OdP
Pz?Q88JqM!"$56L ,1E4H4D$EaHJ88JqrN3L%*QTd2Ah:x:P.PDQQ"%h-!"38A;,b\
9,))++ F :- ))33 F !\1,,.. F ![0++-- F ++33 F
 ww~~f%)@)@A)E"<<JF//**))
 

 F\\&)Fffj&&I

+Y...f%Y	8 	8 	) 	)8 Q
 FQsB   ?!X27X?%Y?YY?	Y	Y+Y;Y2X<?Y	c           
      \   g }|j                         D ]0  }|j                  |j                   d|j                  xs d        2 dddddddt	        |       g}|j                  |       t        |d	      5 }|j                  d
j                  |             ddd       y# 1 sw Y   yxY w)zWrites a HiGHS solution filer;   r   zModel statusNone z# Primal solution valuesFeasiblez
# Columns r3   r4   N)		variablesrF   r   varValuerU   extendrM   rN   rO   )r   filenamerh   variable_rowsvarall_rowsfiles          r   rI   zHiGHS_CMD.writesol   s     <<> 	DC  CHH:Qs||/@q.A!BC	D
 &]+,-
 	&(C  	,DJJtyy*+	, 	, 	,s   8!B""B+c                 l   t        |      5 }|j                         }ddd       d\  }}t              D ]4  \  }}||j                  d      r|dz   }|!|j                  d      s3|}6 ||t	        d      i }||| D ]#  }|j                         \  }	}
t        |
      ||	<   % |S # 1 sw Y   xY w)zRead a HiGHS solution fileN)NNz	# Columnsr   z# RowszCannot read HiGHS solver output)rM   rR   	enumeraterL   r	   rT   float)r   r   r   ru   beginendindexrv   r|   r   values              r   rd   zHiGHS_CMD.readsol   s    (^ 	%tNN$E	%  
s$U+ 	KE4}!=	{tx8		
 =CK!"CDD%$ 	(D**,KD% <F4L	( !	% 	%s   B**B3)NFTTNNNNNNF)__name__
__module____qualname____doc__r   str__annotations__r   intr   r$   r(   r}   rI   rd    r   r   r   r   '   s]    D#NC (
T1*CJ,,r   r   c                        e Zd Zd Z	 ddlad ZdZ	 	 	 	 	 	 	 d fd	Zd Zd Z	d Z
d	 Zd
 Zd Zd Z xZS #  d ZddZY  xZS xY w)r-   r   Nc                 8    t        d| j                   d|       S )N[z] )printr   )logTypelogMsgcallbackValues      r   <lambda>zHiGHS.<lambda>#  s     %~Rx(C
 r   r   c                 d    t        	|   d|||d| || _        || _        || _        || _        y)a  
            :param bool mip: if False, assume LP even if integer variables
            :param bool msg: if False, no log is shown
            :param tuple callbackTuple: Tuple of log callback function (see DEFAULT_CALLBACK above for definition)
                and callbackValue (tag embedded in every callback)
            :param float gapRel: relative gap tolerance for the solver to stop (in fraction)
            :param float gapAbs: absolute gap tolerance for the solver to stop
            :param int threads: sets the maximum number of threads
            :param float timeLimit: maximum time for solver (in seconds)
            :param dict solverParams: list of named options to pass directly to the HiGHS solver
            )r   r   r   Nr   )superr   callbackTupler   r   r   )
r   r   r   r   r   r   r   r   solverParams	__class__s
            r   r   zHiGHS.__init__(  s;    , GS#SlS!.D DK DK"DLr   c                      y)NTr   r#   s    r   r(   zHiGHS.availableD  s    r   c                 8    |j                   j                          y N)solverModelrun)r   rh   s     r   
callSolverzHiGHS.callSolverG  s    NN r   c                 b   t         j                         |_        | j                  rS| j                  rG| j                  xs  t
        j                  t
        j                  f} |j                  j                  |  | j                  s|j                  j                  dd       | j                  &|j                  j                  d| j                         | j                  &|j                  j                  d| j                         | j                  &|j                  j                  d| j                         | j                  /|j                  j                  dt        | j                               | j                  j!                         D ]!  \  }}|j                  j                  ||       # y )Noutput_flagFmip_rel_gapmip_abs_gapr   
time_limit)highspyHighsr   r   r   r-   DEFAULT_CALLBACKDEFAULT_CALLBACK_VALUEsetLogCallbacksetOptionValuer   r   r   r   r   rG   items)r   rh   r   keyr   s        r   createAndConfigureSolverzHiGHS.createAndConfigureSolverJ  s;   $]]_BNxxD.. $ 2 2 !**007 .--}=88--mUC{{&--mT[[I{{&--mT[[I||'--iF~~)--lE$..<QR #..446 :
U--c59:r   c           	         t         j                  }|j                  t        j                  k(  rdnd}t        |j                               D ]  \  }}|j                  }|j                  }|j                  j                  ||j                  j                  |d      z  || n|||n|dg g        ||_        |j                  t        j                  k(  s| j                   s|j                  j#                  |j                  t         j$                  j&                          |j(                  j+                         D ]  }|j-                         D 	cg c]  \  }}	|	dk7  r|j                  |	f }
}}	t/        |
      dk(  rg g }}nt1        |
 \  }}|j3                         }|j5                         }|j                  j7                  || n|||n|t/        |      ||        y c c}	}w )Nr7   r   g        r   )r   	kHighsInfsenser   
LpMaximizer   r   lowBoundupBoundr   addCol	objectiverH   r   cat	LpIntegerr   changeColIntegralityHighsVarTypekIntegerconstraintsr|   r   rU   zipgetLbgetUbaddRow)r   rh   r   obj_multir   lbub
constraintcoefficientnon_zero_constraint_itemsindicescoefficientss                r   buildSolverModelzHiGHS.buildSolverModelg  s   ##CXX)=)==r1H#BLLN3 3\\[[%%r||//S99JSDB:C2 	77i111dhhNN77		7#7#7#@#@$ !nn335 
 -7,<,<,>-(["a' YY,-) - 01Q6,.\G,/1J,K)G\%%'%%'%%JSDB:C2L -s   G#c                 @   |j                   j                         }|j                   j                         }|j                   j                         }t        j
                  }i |j                  t        j                  t        j                  f|j                  t        j                  t        j                  f|j                  t        j                  t        j                  f|j                  t        j                  t        j                  f|j                  t        j                  t        j                  f|j                  t        j                  t        j                  f|j                  t        j                  t        j                  f|j                   t        j"                  t        j$                  f|j&                  t        j(                  t        j*                  f|j,                  t        j(                  t        j*                  f|j.                  t        j0                  t        j2                  f|j4                  t        j"                  t        j6                  f|j8                  t        j"                  t        j6                  f|j:                  t        j"                  t        j6                  f|j<                  t        j"                  t        j6                  f|j>                  t        j                  t        j                  f}tA        |jB                        }|jE                         D ]  }||jF                     |_$         |tK        tL              k(  r:||j:                  |j<                  fv r t        j                  t        j                  fS ||   S r   )'r   getModelStatusgetObjectiveValuegetSolutionr   HighsModelStatuskNotsetr   r^   r_   
kLoadErrorkModelErrorkPresolveErrorkSolveErrorkPostsolveErrorkModelEmptykOptimalrW   rX   kInfeasiblerZ   r[   kUnboundedOrInfeasible
kUnboundedr\   r]   kObjectiveBoundrY   kObjectiveTarget
kTimeLimitkIterationLimitkUnknownlist	col_valuer   r   r   r   r   )	r   rh   r:   	obj_valuesolutionr   status_dict
col_valuesr   s	            r   findSolutionValueszHiGHS.findSolutionValues  sd   ^^224F88:I~~113H&77A ((//77+A
 !++//77.A !,,//77/A !////772A" !,,//77/#A* !00//773+A2 !,,//77/3A: !))--//,;AB !,,0022/CAJ !770022:KAR !++//11.SAZ !00--773[Ab !11--774cAj !++--77.kAr !00--773sAz !))//77,{AKF h001J ||~ 5)#))45 E#J&6 ++ 006 , !22I4W4WWW"6**r   c                 <   | j                  |       | j                  |       | j                  |       | j                  |      \  }}|j	                         D ]	  }d|_         |j                  j                         D ]	  }d|_         |j                  ||       |S )NF)
r   r   r   r   r   modifiedr   r|   modifierrf   )r   rh   r:   rz   r   r   s         r   r}   zHiGHS.actualSolve  s    ))"-!!"%OOB!%!8!8!<FJ||~ %$% !nn335 ,
&+
#, OOFJ/Mr   c                     t        d      )Nz!HiGHS: Resolving is not supportedr	   )r   rh   kwargss      r   actualResolvezHiGHS.actualResolve  s    !"EFFr   c                      y)r&   Fr   r#   s    r   r(   zHiGHS.available  s    r   c                     t        d      )r*   zHiGHS: Not Availabler   )r   rh   callbacks      r   r}   zHiGHS.actualSolve  s    !"899r   )TTNNNNNr   )r   r   r   r   r   r   r   r   r(   r   r   r   r   r}   r   __classcell__)r   s   @r   r-   r-     s|    DlG
 "$ 	#8		!	::+	ZV	+p	"	GQ:		: 	:s	   8 	Ar-   )mathr   typingr   corer   r   r   r	   r`   r   r   r   r-   r   r   r   <module>r      s:    :  E E 	 e ePoGH oGr   