
    kh o                     d   d dl mZmZmZmZ ddlmZ ddlmZ ddl	Z	ddl
Z
ddlmZ ddlZddlmZ dd	lmZ d
Zi dej&                  dej&                  dej&                  dej&                  dej&                  dej&                  dej(                  dej*                  dej,                  dej,                  dej(                  dej(                  dej(                  dej(                  dej(                  dej(                  dej(                  ej(                  ej(                  ej(                  ej(                  ej(                  ej(                  ej(                  ej(                  ej(                  d	ZddgZg dZ G d  d!e      Z G d" d#e      Z G d$ d%e      Z G d& d'      Zy)(   )LpSolver_CMDLpSolverPulpSolverErrorlog    )StringIO)redirect_stdoutN   )	constants)Union)uuid4   OPTIMALOPTIMAL_AGAPOPTIMAL_RGAPOPTIMAL_CONDTARGETCONDITIONAL_OPTIMALFEASIBLE
INFEASIBLE	UNBOUNDEDINFEASIBLE_OR_UNBOUNDEDSOLUTION_LIMNODE_LIM_SOLNODE_LIM_NOSOLITERATION_LIMIT_REACHEDTIME_LIM_SOLTIME_LIM_NOSOLTIME_LIMIT_REACHED)	ABORTED	ABORT_SOLABORT_NOSOL
OUTMEM_SOLOUTMEM_NOSOLFAILEDFAIL_SOL
FAIL_NOSOLERRORcfgnamecfgfile)hostnameportusernamepasswordsessionlocalenamenworkersauthinfoprotocolpathssl_ca_listauthcodepkcec                   @    e Zd Zd Z	 	 	 	 	 ddZd Zd Zd Zd Zd Z	y)		SASsolverNc           	      <    t        j                  | f|||||d| y)aQ  
        :param bool mip: if False, assume LP even if integer variables
        :param bool msg: if False, no log is shown
        :param bool warmStart: if False, no warm start
        :param bool keepFiles: if False, the generated mps mst files will be removed
        :param solverParams: SAS proc OPTMILP or OPTLP parameters
        )mipmsg	keepFiles	timeLimit	warmStartN)r   __init__)selfr<   r=   r@   r>   r?   solverParamss          w/var/www/html/SchoolMeal/SchoolMeal/pds_admin_SchoolMeal/Backend/venv/lib/python3.12/site-packages/pulp/apis/sas_api.pyrA   zSASsolver.__init__^   s3      		
	
 	
    c                     | j                   j                  |d      }|r=|j                         dz   dj                  d |j	                         D              z   dz   S y)zXHelper function to create the strings for the statements of the proc OPTLP/OPTMILP code.N c              3   D   K   | ]  \  }}|d z   t        |      z     yw=Nstr.0optionvalues      rD   	<genexpr>z2SASsolver._create_statement_str.<locals>.<genexpr>   s!     W6C<#e*4W    ; )optionsDictgetstripjoinitems)rB   	statementstmts      rD   _create_statement_strzSASsolver._create_statement_strx   sa    ##It4!((W$**,WWX  rE   c                 d    t         j                  j                  t        j                               S N)osr5   abspathgetcwdrB   s    rD   defaultPathzSASsolver.defaultPath   s    wwryy{++rE   c                 *   |D cg c]/  }|j                         |j                  |j                         f1 }}t        |d      5 }|j                  d       |D ]  \  }}|j                  | d| d        	 ddd       yc c}w # 1 sw Y   yxY w)zWrites a SAS solution fileNwz_VAR_,_VALUE_
,
T)rP   r1   openwrite)rB   filenamevsvvaluesfr1   rP   s           rD   
_write_solzSASsolver._write_sol   s    /1K!QWWY5J1661779%KK(C  	-AGG%&% -e4&%+,-	-  L	- s   BB3B		Bc                    d}t        |d      5 }|j                         D ]=  }t        |t        |j                  d      D cg c]  }t	        |       c}            }? 	 d d d        |dz   S c c}w # 1 sw Y   |dz   S xY w)Nr   rrG   r   )rh   	readlinesmaxsplitlen)rB   fileNamemaxLenrn   linewords         rD   _get_max_upload_lenzSASsolver._get_max_upload_len   s    (C  	SA SVS

3)P#d))P%QRS	S z *Q	S zs   2A3A.A3.A33B c                    t         | j                  j                  dd         }|j                  dd      }|d   j	                         }|j                  |       |dk(  r|d   j	                         }|j                  |       |j                  d	d      }|d   j	                         }|j                  |       |d
   j	                         }	|j                  |	d       |j                  |       |S )NSOLUTION_STATUSr(   _VAR_T)drop_VALUE_OPTLP_R_COST__ROW_
_ACTIVITY_)activity)
SOLSTATUS_TO_STATUS_macrorV   	set_indexto_dictassignVarsValsassignVarsDjassignConsPiassignConsSlackassignStatus)
rB   lp
primal_outdual_outprocstatusrm   rcpricesslackss
             rD   _read_solutionzSASsolver._read_solution   s    $T[[__5F%PQ))')=
I&..0
&!7?J'//1BOOB))')=Hi(002FOOF#l+335Fv5
rE   TTFFN)
__name__
__module____qualname__r1   rA   r\   rc   ro   rz   r    rE   rD   r:   r:   [   s6    D 
4,rE   r:   c                       e Zd Zd Z	 ddlat        j
                  j                  ej                         	 	 	 	 	 d	dZ	d Z
d Zd Zy#  d Zd
dZY yxY w)SAS94r   Nc           	      r   i | _         t        D ]&  }|j                  |d      }|s|| j                   |<   ( t        j                  | f|||||d| d| _        	 dt        j                  _        t        j                  di | j                   | _        dt        j                  _        y# t        $ r Y yw xY w)  
            :param bool mip: if False, assume LP even if integer variables
            :param bool msg: if False, no log is shown
            :param bool keepFiles: if False, mps and mst files will not be saved
            :param bool warmStart: if False, no warmstart or initial primal solution provided
            :param solverParams: SAS proc OPTMILP or OPTLP parameters
            Nr<   r=   r>   r@   r?   TFr   )_saspy_optionsSASPY_OPTIONSpopr:   rA   sassaspyloggerdisabled
SASsession	Exception	rB   r<   r=   r>   r@   r?   rC   rO   rP   s	            rD   rA   zSAS94.__init__   s    " #%D' 8$((627D''/8
 ###  DH(,% ++Bd.A.AB(-% s   AB* *	B65B6c                 R    | j                   r| j                   j                          y y r^   )r   endsasrb   s    rD   __del__zSAS94.__del__   s    xx! rE   c                     | j                   ryy)True if SAS94 is available.TF)r   rb   s    rD   	availablezSAS94.available   s    xxrE   c                 J   t        j                  d       | j                  st        d      | j                  }t	        |j
                        st	        |j                        rt        d      t               j                  dd }d| d}t        j                  j                  | j                  |      }d| }d| d	}t        j                  j                  | j                  |      }d| }	|j                  |d
      }
| j                  |      }|t        kD  rt        dt         d      d
}|}|j!                  |d      s|j#                  ||d       |}d}| j$                  j'                  dd      }|dk(  rd}n(|dk(  rd}n |j)                         r| j*                  rdnd}g d}| j$                  j-                         D ci c]  }||vr|| j$                  |    }}| j$                  j/                  dd      }|j0                  t2        j4                  k(  rd|d<   n.|j0                  t2        j6                  k(  rd|d<   nt        d      | j8                  r| j8                  |d<   | j;                  d      }| j;                  d      }| j;                  d      }| j;                  d       }| j;                  d!      }|j)                         r&|dk(  s| j*                  st=        j>                  d"       d#}d
}|rg| jA                  ||
$       |}|j!                  |d      s|j#                  ||	d       |	}d}|dk(  rd%jC                  ||&      }d'| |d'<   n|dk(  r	 d(j                  d) |jE                         D              }d*}|jF                  d+   }|jF                  jI                  d,d-      d-   d+   }|d.k(  rtK        |      d/k  rtM        d0      |d.k(  rKtK        |      d/k(  r=|jO                  d1jC                  |||||tQ        |t              ||||||2      d34      } n-|jO                  d5jC                  |||||||||||6      d34      } | jS                  ||       |r|jU                  |d       |r|jU                  |	d       | jV                  r| d7   | _,        t[        | jX                         t]        d8 d9 |j_                  d:|z   d;z         jI                         D        D              | _0        | j`                  j/                  d<d=      d>k7  r@t        d?jC                  | j`                  j/                  d<d=      |jb                  @            |je                  dA|       }!|je                  dB|       }"| jg                  ||!|"|      }#|#S c c}w )C"Solve a well formulated lp problemRunning SASz^SAS94: Cannot connect to a SAS session. Try the cfgfile option or adjust options in that file.z3SAS94: Currently SAS doesn't support SOS1 and SOS2.N   pulpz.mpsz/tmp/z.mstFwith_objsensezSAS94: The lengths of the variable or constraint names                                     (including indices) should not exceed .T)quiet)	overwritewithr   r   milpOPTMILP)r@   decompdecompmasterdecompsubprobrootnoder@   rs   objsenseminz-SAS94 : Objective sense should be min or max.MAXTIMEr   r   decompmasteripr   r   z:SAS94 will solve the relaxed problem of the MILP instance.rT   rj   rk   an  
                                    proc import datafile='{primalin}'
                                        out=primalin{postfix}
                                        dbms=csv
                                        replace;
                                        getnames=yes;
                                        run;
                                    )primalinpostfixr   rG   c              3   D   K   | ]  \  }}|d z   t        |      z     ywrI   rK   rM   s      rD   rQ   z$SAS94.actualSolve.<locals>.<genexpr>r  s&      .;fes5z)rR   z3option notes nonumber nodate nosource pagesize=max;r   Mr   9   z6Support for SAS 9.4 M4 and earlier is not implemented.a  
                                {sas_options}
                                option notes nonumber nodate nosource pagesize=max;
                                {warmstart}
                                %MPS2SASD(MPSFILE="{mpsfile}", OUTDATA=mpsdata{postfix}, MAXLEN={maxLen}, FORMAT=FREE);
                                proc {proc} data=mpsdata{postfix} {options} primalout=primalout{postfix} dualout=dualout{postfix};
                                {decomp}
                                {decompmaster}
                                {decompmasterip}
                                {decompsubprob}
                                {rootnode}
                                proc delete data=mpsdata{postfix};
                                run;
                                )sas_options	warmstartr   mpsfiler   rw   optionsr   r   r   r   r   TEXT)resultsa  
                                {sas_options}
                                {warmstart}
                                proc {proc} mpsfile="{mpsfile}" {options} primalout=primalout{postfix} dualout=dualout{postfix};
                                {decomp}
                                {decompmaster}
                                {decompmasterip}
                                {decompsubprob}
                                {rootnode}
                                run;
                                )r   r   r   r   r   r   r   r   r   r   r   LOGc              3   b   K   | ]'  \  }}|j                         |j                         f ) y wr^   )rW   )rN   keyrP   s      rD   rQ   z$SAS94.actualSolve.<locals>.<genexpr>  s-      C ekkm,s   -/c              3   >   K   | ]  }|j                  d         ywrI   )rt   )rN   pairs     rD   rQ   z$SAS94.actualSolve.<locals>.<genexpr>  s      #(,DJJsO#s   _OR_STATUSr(   OKz[PuLP: Error ({err_name})                         while trying to solve the instance: {name}err_namer1   	primaloutdualout)4r   debugr   r   ru   sos1sos2r   hexr_   r5   rX   tmpDirwriteMPSrz   MAX_NAME_LENGTH	file_infouploadrU   r   isMIPr<   keysrV   senser   
LpMaximize
LpMinimizer?   r\   warningswarnro   formatrY   sasverrt   intNotImplementedErrorsubmitr   delete_tmp_filesfile_deleter=   _logprintdictsymgetr   r1   sd2dfr   )$rB   r   r   r   mpsNamelocalMps	remoteMpsmstNamelocalMst	remoteMstrk   nameLen
upload_mpsusedMpswith_optr   
optionListr   solverOptionsr@   
decomp_strdecompmaster_strdecompmasterip_strdecompsubprob_strrootnode_strwarmstart_str
upload_pinusedMstopt_strr   major_versionminor_versionresr   r   r   s$                                       rD   actualSolvezSAS94.actualSolve   s   IIm$88%t  ((C277|s277|%I  gkk#2&GWIT*Gww||DKK9Hy)IWIT*Gww||DKK9Hy)IXU;B..x8G(%KKZJ[[\^  JG===6

8Y$
?#!
 ''++FD9H4V# %'XXZDHHy7J  ++002j( T%%c**M 
 ((,,[$?I xx9///,1j)Y111,1j)%&UVV ~~+/>>i(33H=J#99.I!%!;!;<L!M $ : :? K55jALxxztwdhhP MJb9 #}}XT}:JJ !"&  
 (G!%J 9$%( )/!( ' )/ ) " 3;7)0DM*-W_ hh ?L?R?R?T G
 PK  JJqMMJJ,,S!4Q7:M#M(:Q(>)L  #%#m*<*A jj$ %+F$/"/ ' '!"7O< ')%5'9&7!- %+ % #9 ! @ jj
$ %+F$/"/ '! ' ')%5'9&7!- %+ % #1 ! 8 !!(H5 	6	6 xxJ	dii  #03

54<#;M0N0T0T0V# DK {{x1T9%DDJF!%7!C"'' EK E  Ywi#89Jyy77)!45H((Z4HFM]s   
V c                      y)r   Fr   rb   s    rD   r   zSAS94.available       rE   c                     t        d      )$Solves a well-formulated lp problem.zSAS94 : Not Availabler   rB   r   callbacks      rD   r  zSAS94.actualSolve   s    !"9::rE   r   r^   )r   r   r   r1   r   r   setLevelr   levelrA   r   r   r  r   rE   rD   r   r      sa    Do 	cii( *	X	"	g	I;		;s   A 	Ar   c                   n    e Zd Zd Z	 ddla	 	 	 	 	 ddZd Zd Zd Zd Z	d Z
y# e$ r
 d	 Zdd
ZY yw xY w)SASCASr   Nc           	         d| _         i | _        t        D ]&  }|j                  |d      }|s|| j                  |<   ( | j                  i k(  rft	        j
                  d      | j                  d<   t	        j
                  d      | j                  d<   t	        j
                  d      | j                  d<   t        j                  | f|||||d| 	 t        j                  d	i | j                  | _         y# t        $ r Y yw xY w)
r   N
CAS_SERVERr+   CAS_PORTr,   CAS_AUTHINFOr3   r   r   )cas_cas_optionsSWAT_OPTIONSr   r_   getenvr:   rA   swatCASr   r   s	            rD   rA   zSASCAS.__init__  s     DH !#D& 6$((605D%%f-6
   B&02		,0G!!*-,.IIj,A!!&)02		.0I!!*-### 888d&7&78 s   $C5 5	D Dc                 R    | j                   r| j                   j                          y y r^   )r$  closerb   s    rD   r   zSASCAS.__del__&  s    xx  rE   c                     | j                   syy)NFT)r$  rb   s    rD   r   zSASCAS.available*  s    88rE   c           	         t        j                  d       | j                  st        d      | j                  }t	        |j
                        st	        |j                        rt        d      | j                  j                  dd      }| j                  j                  dd      }|dk(  rd	}n(|d
k(  rd}n |j                         r| j                  rdnd	}| j                  }|j                  t        j                  k(  rd|d<   n.|j                  t        j                  k(  rd|d<   nt        d      | j                  r| j                  |d<   d}t!        t#        | j$                              5 | _        |j)                  d       t+               j,                  dd }| j/                  |j0                  ddd      \  }	}
}|j3                  |	d      }| j5                  |	      }|t6        kD  rt        dt6         d      	 |j                         r!| j                  st9        j:                  d       | j=                  ||	|
||       |r<|dk(  r7| j?                  ||       |jA                  |d| ddddi        d| |d<   | jC                  |	||
       |dk(  r+ |jD                  jF                  d)d!d"| id#| ddd$|}n1 |jD                  jH                  d)d!d"| id#| ddd%| ddd&|}|r,| jK                  |||||      \  }}| jM                  ||||      }| jC                  |	||
       	 ddd       |r|S t        d'|j0                   d(      # | jC                  |	||
       w xY w# 1 sw Y   >xY w)*r   r   zDSASCAS: Cannot connect to a CAS. Try setting CAS connection options.z4SASCAS: Currently SAS doesn't support SOS1 and SOS2.r@   Fr   Nr   r   r   r   rs   r   r   z.SASCAS : Objective sense should be min or max.r   optimizationr   mpszmps.csvzmst.csvr   zSASCAS: The lengths of the variable or constraint names                                         (including indices) should not exceed r   z;SASCAS will solve the relaxed problem of the MILP instance.r   r   Tr1   replacefiletypeCSVcasoutimportoptionsr1   mpsdatar   )data	primalOutr   )r8  r9  dualOutzPPuLP: Error while trying to solve the instance:                                 z via SASCAS.r   )'r   r   r$  r   ru   r   r   rU   r   r   r<   r   r   r   r   r?   r	   SASLogWriterr=   _log_writerloadactionsetr   r   create_tmp_filesr1   r   rz   r   r   r   	_load_mpsro   upload_filer   r.  	solveMilpsolveLp_get_outputr   )rB   r   sr@   r  r   r  r   r   tmpMps	tmpMpsCsv	tmpMstCsvrk   r  rq   r   r   s                    rD   r  zSASCAS.actualSolve0  s   IIm$88%Z  A277|s277|%J  ((,,[%@I ''++FD9H4V# %'XXZDHHy7 !,,M xx9///,1j)Y111,1j)%&VWW ~~+/>>i(F dhh!78 7HD<L/  '++cr*/3/D/DGGUIy0,	9 [[u[=226:_,)OO^N__`b &Hxxz$(( Y NN1fi'J di&7rB%.6wi,@T#R+5u*= & 
 7?wi4Hj1))&)YG y(4ANN44 "(GG9*=!>1:7)/DQU&V , 3ANN22 "(GG9*=!>1:7)/DQU&V/6wi-@T$R ,	 /3/?/?Aq$PW/X,
H!%!4!4RXt!T))&)YGo7Hr %!!#	7  ))&)YGo7H 7Hs&   .BM6?D&M%M6M33M66M?c                 f   |j                  dd      j                         |j                  dd      j                         d| _        | j                  j                  dd      dk7  r@t        dj	                  | j                  j                  dd      |j
                              |d	k(  r0|j                  d
|       j                         }|ddg   }d }||fS |j                  d
|       j                         }|g d   }|j                  d|       j                         }|g d   }||fS )Nr   r(   solutionStatus)r   r|   r   r   zCPuLP: Error ({err_name}) while trying to solve the instance: {name}r   r   r   )r1   r}   r   )r}   r   _STATUS_r   r   )r   r   rJ  r   )rV   upperr   r   r   r1   CASTableto_frame)rB   r   rD  rq   r   r   r   r   s           rD   rC  zSASCAS._get_output  s:   %%'288:#$55)97#C#I#I#KDK {{x1T9%Y``!%7!C"'' a   y ZZy	-BZCLLN
')(<=
 x''	 ZZy	-BZCLLN
'(TU
::WWI+>:?HHJ#$RSx''rE   c           
         t        j                  |      j                  dk\  rt        |d      5 }|j	                  d       t        |d      5 }d}|D ]8  }	|dz  }|j	                  t        |      dz   |	j                         z   dz          : 	 d d d        d d d        |j                  |d	| d
dddd       |j                  j                  d	| d| d
ddt        |t                     y t        |d      5 }
|j                  j                  |
j                         d| d
ddt        |t                     d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nl        re   z
_ID_	Text
rq   r   r   	rg   mpscsvTr0  r3  )r2  	delimiterr4  r7  FREE)r8  casOutr   	maxLength)mpsFileStringr5  r   rT  )r_   statst_sizerh   ri   rL   rstripr@  r.  
convertMpsr   r   loadMpsread)rB   rD  rE  rF  r   r  	mpsWithIdrn   idrx   mps_files              rD   r?  zSASCAS._load_mps  s   wwv&&+5)S) SYOON3fc* Sa$% SD!GB%OOCGdNT[[],JT,QRSSS &,WI$64H/44"H   ))!'+&-gY$7DI!!'?;	 *  &#& (NN**&.mmo*1'(;M%"%g"?	 +  -S SS S0 s1   EA E	E>AE!	E	EE!E*c                      y)zTrue if SASCAS is available.Fr   rb   s    rD   r   zSASCAS.available  r  rE   c                     t        d      )r  zSASCAS : Not Availabler  r  s      rD   r  zSASCAS.actualSolve  s    !":;;rE   r   r^   )r   r   r   r1   r(  rA   r   r   r  rC  r?  ImportErrorr   rE   rD   r  r    s^    Dm  .	`	!	i	V	(.!	Q  <		<<s   % 44r  c                   $    e Zd Zd Zd Zd Zd Zy)r;  c                 Z    || _         t               | _        t        j                  | _        y r^   )teer   r   sysstdout)rB   rd  s     rD   rA   zSASLogWriter.__init__  s    J	jjrE   c                     | j                   r| j                  j                  |       | j                  j                  |       y r^   )rd  rf  ri   r   )rB   messages     rD   ri   zSASLogWriter.write  s+    88KKg&		 rE   c                      y r^   r   rb   s    rD   flushzSASLogWriter.flush  s    rE   c                 6    | j                   j                         S r^   )r   getvaluerb   s    rD   r   zSASLogWriter.log  s    yy!!##rE   N)r   r   r   rA   ri   rj  r   r   rE   rD   r;  r;    s    !!$rE   r;  )corer   r   r   r   ior   
contextlibr	   r_   re  rT   r   r   typingr   uuidr   r   LpStatusOptimalLpStatusNotSolvedLpStatusInfeasibleLpStatusUnboundedr   r   r&  r:   r   r  r;  r   rE   rD   <module>rv     s  6 ? >  & 	 
     y((I-- I-- I--	
 i'' 944 	++ ).. ,, y:: I// I// i11 y:: I//  i11!" )55#$ **,,..--//))++--((5 : I&$P PfrI rj	pY pf$ $rE   