
    kh1                        d Z ddlZddlZddlZddlZddlZd Zd Z e       Z e       Z	ddl
mZ ddlmZ ddlmZ dd	lmZ ddlZ	 ddlZ ej.                  e      ZddlZej6                  Zd
 ZddlmZ  G d dej@                        Z! G d d      Z" G d de"      Z#ejH                  fdZ%y# e$ r ddlZY pw xY w)z
This file contains the solver classes for PuLP
Note that the solvers that require a compiled extension may not work in
the current version
    Nc                  P    t         j                  dv ryt         j                  dv ryy)N)win32cliwin)darwinosxlinux)sysplatform     t/var/www/html/SchoolMeal/SchoolMeal/pds_admin_SchoolMeal/Backend/venv/lib/python3.12/site-packages/pulp/apis/core.pyget_operating_systemr   (   s$    
||''
||z!r   c                  z    t         j                  dkD  } | r&t        j                         j	                         dv ryyy)Nl        )aarch64arm64r   i64i32)r
   maxsizer   machinelower)	is_64bitss    r   get_archr   0   s7    e#I##%)==r   )	monotonic)Union   )sparse)	constantsc                 4    t        |       j                         S N)strencode)_objs    r   <lambda>r$   O   s    T))+ r   )uuid4c                       e Zd ZdZy)PulpSolverErrorz(
    Pulp Solver-related exceptions
    N)__name__
__module____qualname____doc__r   r   r   r'   r'   T   s     	r   r'   c                   Z    e Zd ZdZd Z	 ddZd Zd Zd Zd Z	d Z
	 dd	Zd
 ZeZd ZeZy)LpSolverzA generic LP SolverNc                     |g }|| _         || _        || _        || _        |j	                         D ci c]  \  }}|	|| c}}| _        yc c}}w )a  
        :param bool mip: if False, assume LP even if integer variables
        :param bool msg: if False, no log is shown
        :param list options:
        :param float timeLimit: maximum time for solver (in seconds)
        :param args:
        :param kwargs: optional named options to pass to each solver,
                        e.g. gapRel=0.1, gapAbs=10, logPath="",
        N)mipmsgoptions	timeLimititemsoptionsDict)	selfr/   r0   r1   r2   argskwargskvs	            r   __init__zLpSolver.__init__a   sT     ?G" .4\\^MTQq}AqDMMs
   
AAc                     t         )zTrue if the solver is availableNotImplementedErrorr5   s    r   	availablezLpSolver.availablex       !!r   c                     t         )z"Solve a well formulated lp problemr<   r5   lps     r   actualSolvezLpSolver.actualSolve|   r@   r   c                 *     | j                   |fi | y)z
        uses existing problem information and solves the problem
        If it is not implemented in the solver
        just solve again
        N)rD   )r5   rC   r7   s      r   actualResolvezLpSolver.actualResolve   s     	&v&r   c                     | j                         }| j                  |_        | j                  |_        | j                  |_        |S zMake a copy of self)	__class__r/   r0   r1   r5   aCopys     r   copyzLpSolver.copy   s6      HH	HH	r   c                 $    |j                  |       S )zSolve the problem lp)solverB   s     r   rN   zLpSolver.solve   s     xx~r   c                 
   |2t         j                  dt         j                  dt         j                  di}|"t         j                  dt         j
                  di}|"t         j                  dt         j                  di}d	dl}d	}t        |j                               }t        |      }	t        |	      D 
ci c]  }
||
   |

 c}
| _        t        |	      D 
ci c]  }
||
   j                  |
 c}
| _        t        |	      D 
ci c]  }
|
||
   
 c}
| _        ||j"                     }|j$                  |	z  } |       }|j&                  j)                         D ]  \  }}||| j                  |   <     |j$                  d
      }|j*                  |	z  } |       } |       } |       } |       }|j                         D ]  }t-        |j                        || j                  |   <   d
|| j                  |   <   |j.                  dk7  r|j.                  || j                  |   <   n| || j                  |   <   |j0                  dk7  r|j0                  || j                  |   <   ||| j                  |   <    t        |j2                        }|j$                  |z  }|j*                  |z  }|j4                  |z  } |       } |       } |       } |       }i | _        i | _        d	}
|j2                  D ]}  }|j2                  |   j:                   ||
<   d
||
<   t-        |      ||
<   t-        ||j2                  |   j"                           ||
<   |
| j6                  |<   || j8                  |
<   |
dz   }
 |j=                         }t?        j@                  t        t        |            t        t        |	                  } |D ]3  \  }!}"}#| jC                  | j6                  |"   | j                  |!   |#       5 | jE                         \  }$}%}&}'}(tG        |(|j$                        })tG        |'|jH                        }*tG        |%|jH                        }+tG        |&|jH                        },|j4                  |	z  }- |-       }.|jK                         r=|j                         D ]*  }t-        ||jL                           |.| j                  |   <   , |	| _'        || _(        |	||$||||||||+|,|*|)||||||.| j                   | j8                  fS c c}
w c c}
w c c}
w )zreturns the arrays suitable to pass to a cdll Cplex
        or other solvers that are similar

        Copyright (c) Stuart Mitchell 2007
        NELGCI   r   g        ))constLpConstraintEQLpConstraintLELpConstraintGELpContinuous	LpInteger
LpMaximize
LpMinimizectypeslist	variableslenrangev2nnamevname2nn2vsensec_double	objectiver3   c_char_p	to_stringlowBoundupBoundconstraintsc_charc2nn2cconstantcoefficientsr   Matrixaddcol_based_arraysctypesArrayFillc_intisMIPcat	addedVars	addedRows)/r5   rC   	senseDictLpVarCategoriesLpObjSensesinfBoundr_   
rangeCountra   numVarsiobjSenseNumVarDoubleArrayobjectCoeffsr9   valobjectConstNumVarStrArraycolNameslowerBoundsupperBounds
initValuesnumRowsNumRowDoubleArrayNumRowStrArrayNumRowCharArray	rhsValuesrangeValuesrowNamesrowTypeccoeffssparseMatrixvarrowcoeffnumelsmystartsBase	mylenBase	myindBase
myelemBaseelemBaseindBase
startsBaselenBaseNumVarCharArray
columnTypes/                                                  r   getCplexStyleArrayszLpSolver.getCplexStyleArrays   s    $$c$$c$$cI
 "$113MO ++R1A1A1EK
(	i.-27^<IaL!O<6;GnE	!))1,E-27^<Ay|O<rxx("OOg5(*ll((* 	,FAs(+L!%	, &fooc*72!#')')&(
 
	4A$-aff$5HTXXa[!&)Jtxx{#zzT!+,::DHHQK(,49DHHQK(yyD +,99DHHQK(+3DHHQK(
	4 bnn%"OOg572 --'1%'	')!#!# 	ANN1-666IaL KN#A,HQK"9R^^A->-D-D#EFGAJDHHQKDHHQKAA	 "}}T%.%94g;OP% 	FOCeTXXc]DLL,=uE	F ))+	
":v?!)V\\:$\6<<@
!)V\\: --'1$&
88:\\^ L*3OAEE4J*K
488A;'L  HHHH-
 	
S =E<s   4S=TTc                    t        | j                        }dD ]  }	 t        | |      ||<    dD ]  }	 t        | |      }|r|||<    |j	                  | j
                         |S # t        $ r Y Xw xY w# t        $ r Y Pw xY w)N)solver)r/   r0   	keepFiles)r2   r1   )dictre   getattrAttributeErrorupdater4   )r5   datar8   values       r   toDictzLpSolver.toDict  s    499%, 	A!$*Q	
 * 	Aa(#DG	 	D$$% "  " s"   A&A5&	A21A25	B Bc                     t        |d      5 }t        j                  | j                         |g|i | d d d        y # 1 sw Y   y xY wNw)openjsondumpr   )r5   filenamer6   r7   fs        r   toJsonzLpSolver.toJson&  sA    (C  	9AIIdkkmQ888	9 	9 	9s	   )?A)TTNN)NNNg@xD)r(   r)   r*   r+   re   r:   r?   rD   rF   rL   rN   r   r   to_dictr   to_jsonr   r   r   r-   r-   \   sT    D ;?N.""' TXy
v$ G9 Gr   r-   c                       e Zd ZdZd ZddZd Zd Zd Zde	e
eej                  f   ddfd	Zd
 Zd Zed        Zed        Zd Zy)LpSolver_CMDz A generic command line LP SolverNc                     t        j                  | g|i | || j                         | _        n|| _        || _        | j                          y)aX  

        :param bool mip: if False, assume LP even if integer variables
        :param bool msg: if False, no log is shown
        :param list options: list of additional options to pass to solver (format depends on the solver)
        :param float timeLimit: maximum time for solver (in seconds)
        :param str path: a path to the solver binary
        :param bool keepFiles: if True, files are saved in the current directory and not deleted after solving
        :param args: parameters to pass to :py:class:`LpSolver`
        :param kwargs: parameters to pass to :py:class:`LpSolver`
        N)r-   r:   defaultPathpathr   	setTmpDir)r5   r   r   r6   r7   s        r   r:   zLpSolver_CMD.__init__2  sI     	$000<((*DIDI"r   c                     t         j                  |       }| j                  |_        | j                  |_        | j                  |_        |S rH   )r-   rL   r   r   tmpDirrJ   s     r   rL   zLpSolver_CMD.copyF  s8     d#YY
..{{r   c                    t         j                  dk7  rUt         j                  j                  dd      | _        t         j                  j                  d| j                        | _        nt         j                  j                  dd      | _        t         j                  j                  d| j                        | _        t         j                  j                  d| j                        | _        t         j
                  j                  | j                        sd| _        yt        j                  | j                  t         j                  t         j                  z         sd| _        yy)zTSet the tmpDir attribute to a reasonnable location for a temporary
        directoryntTMPDIRz/tmpTMP TEMPN)
osre   environgetr   r   isdiraccessF_OKW_OKr>   s    r   r   zLpSolver_CMD.setTmpDirO  s     77d?**..6:DK**..<DK **..26DK**..<DK**..=DKww}}T[[)DK4;;"''(9:DK ;r   c                     | j                   r|n<t        j                  j                  | j                  t               j                        fd|D        S )Nc              3   ,   K   | ]  } d |   yw)z-pulp.Nr   ).0nprefixs     r   	<genexpr>z0LpSolver_CMD.create_tmp_files.<locals>.<genexpr>e  s     36(&$3s   )r   r   r   joinr   r%   hex)r5   re   r6   r   s      @r   create_tmp_fileszLpSolver_CMD.create_tmp_files`  s8    >>FWW\\$++uw{{;F3d33r   filereturnc                 N    	 t        j                  |       y # t        $ r Y y w xY wr    )r   removeFileNotFoundError)r5   r   s     r   silent_removezLpSolver_CMD.silent_removeg  s$    	IIdO  		s    	$$c                 N    | j                   ry |D ]  }| j                  |        y r    )r   r   )r5   r6   r   s      r   delete_tmp_fileszLpSolver_CMD.delete_tmp_filesm  s)    >> 	%Dt$	%r   c                     t         r    r<   r>   s    r   r   zLpSolver_CMD.defaultPaths  s    !!r   c                 6    t         j                  dk7  r| S | dz   S )Nr   z.exe)r   re   )re   s    r   executableExtensionz LpSolver_CMD.executableExtensionv  s    77d?K&= r   c                 ,    t        j                  |       S )zXChecks that the solver command is executable,
        And returns the actual path to it.)shutilwhich)commands    r   
executablezLpSolver_CMD.executable}  s     ||G$$r   c                 P    | j                   ry t        t        j                  d      S r   )r0   r   r   devnullr>   s    r   get_pipezLpSolver_CMD.get_pipe  s    88BJJ$$r   )NF)r(   r)   r*   r+   re   r:   rL   r   r   r   r!   bytesr   PathLiker   r   r   staticmethodr   r   r   r   r   r   r   r   -  sx    *D("4%UBKK(?"@ T %" ! ! % %
%r   r   c                 `    |t        |       z  } |       }t        |       D ]
  \  }}|||<    |S )z^
    Creates a c array with ctypes from a python list
    type is the type of the c array
    )rb   	enumerate)myListtypectypecListr   elems         r   rx   rx     s?    
 3v;EGEV$ 4aLr   )&r+   r   r   r   r
   r_   r   r   operating_systemarchtimer   clocktypingr   r   r   r   rW   loggingujsonr   ImportError	getLoggerr(   log
subprocessDEVNULLr   rl   uuidr%   	PulpErrorr'   r-   r   ri   rx   r   r   r   <module>r     s   6 
   
  () z #   !  g! 


+	 	eoo 	N NbY%8 Y%x "( 	E
  s   B1 1	B=<B=