
    khO                     x    d dl mZ d dlmZ ddlmZmZmZ d dl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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               y/var/www/html/SchoolMeal/SchoolMeal/pds_admin_SchoolMeal/Backend/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.defaultPathY   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       | j/                         }t1        j2                  |	||!      }|j5                         d"k(  rt        d#| j                  z         ||j7                          t)        |d$      5 }|j9                         }ddd       D cg c]   }|j;                         j=                         " }}|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"   }|jA                         d/k(  r!tB        jD                  tB        jF                  }}n|jA                         d0k(  r!tB        jD                  tB        jH                  }}n|jA                         d1k(  r!tB        jJ                  tB        jL                  }}nT|jA                         d2k(  r!tB        jN                  tB        jP                  }}n tB        jR                  tB        jT                  }}tV        j                  jY                  |      r"tW        jZ                  |      j\                  d(k(  rtB        jT                  }d}nE|tB        jT                  tB        jL                  tB        jP                  hv rd}n| j_                  |      }| ja                  |||||       |jc                  ||       |tB        jD                  k(  r|je                  |       |S # 1 sw Y   6x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)3r&   r   r   checkDuplicateVarscreate_tmp_filesr   writeMPSappendr   r   r   optionsDictr   r   getwritesoliterr   next
startswithopenwritejoinget_pipe
subprocessPopenwaitclose	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pipeprocesslog_filelinesline
model_linemodel_statussol_line
sol_statusr9   
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))  JJL.#& 	)(&&(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%_	8 	8&	) 	)8 Q
 FQsB   ?!YY!6%Y.!Y31Y3!	Y8+Y8Y=Y=Y!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 r2   r3   N)		variablesrE   r   varValuerW   extendrL   rM   rN   )r   filenamerj   variable_rowsvarall_rowsfiles          r   rH   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)rL   rT   	enumeraterK   r   rV   float)r   r   r   rx   beginendindexry   r   r   values              r   rf   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   rH   rf    r   r   r   r   (   s]    D#NC (
T1*FP,,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.availableH  s    r   c                 8    |j                   j                          y N)solverModelrun)r   rj   s     r   
callSolverzHiGHS.callSolverK  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   rF   items)r   rj   r   keyr   s        r   createAndConfigureSolverzHiGHS.createAndConfigureSolverN  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&                          t        |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 )Nr6   r   g        r   )r   	kHighsInfsenser
   
LpMaximizer   r   lowBoundupBoundr   addCol	objectiverG   r   cat	LpIntegerr   changeColIntegralityHighsVarTypekIntegerconstraintsr   r   rW   zipgetLbgetUbaddRow)r   rj   r   obj_multir   lbub
constraintcoefficientnon_zero_constraint_itemsindicescoefficientss                r   buildSolverModelzHiGHS.buildSolverModelk  s   ##CXX)=)==r1H#BLLN3 3\\[[%%r||//S99JSDB:C2 	77i111dhhNN77		7#7#7#@#@$ "+2>>+@+@+B!C : -7,<,<,>-(["a' YY,-) - 01Q6,.\G,/1J,K)G\#$
 %%'%%'%%JSDB:C2L !-s   G6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                        }tA        |jD                        }|jG                         }	|	D ]*  }
||
jH                     |
_%        ||
jH                     |
_&        , tA        |jN                  jQ                               }tA        |jR                        }tA        |jT                        }|D ]i  }|jV                  ||jH                     z   |_,        |jZ                  t        j\                  k(  r|xjX                  dz  c_,        ||jH                     |_/        k |ta        tb              k(  r:||j:                  |j<                  fv r t        j                  t        j                  fS ||   S )Ng      )2r   getModelStatusgetObjectiveValuegetSolutionr   HighsModelStatuskNotsetr
   r`   ra   
kLoadErrorkModelErrorkPresolveErrorkSolveErrorkPostsolveErrorkModelEmptykOptimalrY   rZ   kInfeasibler\   r]   kUnboundedOrInfeasible
kUnboundedr^   r_   kObjectiveBoundr[   kObjectiveTarget
kTimeLimitkIterationLimitkUnknownlist	col_valuecol_dualr   r   r   djr   r   	row_valuerow_dualconstantslackr   LpConstraintLEpir   r   )r   rj   r9   	obj_valuesolutionr   status_dict
col_values	col_dualslp_variablesr   constraints_list
row_values	row_dualsr   s                  r   findSolutionValueszHiGHS.findSolutionValues  s0   ^^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X../I <<>L# .)#))4"399-.  $BNN$9$9$;<h001JX../I. <

 $.#6#6JDTDT9U#U
 ##y'?'??$$,$ )**:*: ;
< E#J&6 ++ 006 ,
 //77 
 #6**r   c                 <   | j                  |       | j                  |       | j                  |       | j                  |      \  }}|j	                         D ]	  }d|_         |j                  j                         D ]	  }d|_         |j                  ||       |S )NF)
r   r   r   r  r   modifiedr   r   modifierrh   )r   rj   r9   r}   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   rj   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   rj   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@G
 "$ 	#8		!	::-	^h	+T	"	Gy:		: 	:s	   8 	Ar,   )mathr   typingr   corer   r   r   rP   rb   r   r
   r   r,   r   r   r   <module>r     s=    :  9 9  	 h hVCGH CGr   