
    kha:                     J    d dl mZmZ ddlmZ ddlZddlmZ  G d de      Zy)	   )LpSolverPulpSolverError   )	constants    N)Optionalc                       e Zd ZdZd Z	 ddlat
        j                         Zdddddt
        j                  j                  fde
e   de
e   fdZd	 Zd
 ZddZd Zd Zd ZddZy# e$ r
 d ZddZY yw xY w)MOSEKz2Mosek lp and mip solver (via Mosek Optimizer API).r   NT 	timeLimitoptionsc                 L   || _         || _        || _        || _        || _        |i }|| _        | j                  jdt        j                  j                  h}|j                  | j
                  j                               st        d      | j                  | j
                  d<   yy)a  Initializes the Mosek solver.

            Keyword arguments:

            @param mip: If False, then solve MIP as LP.

            @param msg: Enable Mosek log output.

            @param float timeLimit: maximum time for solver (in seconds)

            @param options: Accepts a dictionary of Mosek solver parameters. Ignore to
                            use default parameter values. Eg: options = {mosek.dparam.mio_max_time:30}
                            sets the maximum time spent by the Mixed Integer optimizer to 30 seconds.
                            Equivalently, one could also write: options = {"MSK_DPAR_MIO_MAX_TIME":30}
                            which uses the generic parameter name as used within the solver, instead of
                            using an object from the Mosek Optimizer API (Python), as before.

            @param task_file_name: Writes a Mosek task file of the given name. By default,
                            no task file will be written. Eg: task_file_name = "eg1.opf".

            @param sol_type: Mosek supports three types of solutions: mosek.soltype.bas
                            (Basic solution, default), mosek.soltype.itr (Interior-point
                            solution) and mosek.soltype.itg (Integer solution).

            For a full list of Mosek parameters (for the Mosek Optimizer API) and supported task file
            formats, please see https://docs.mosek.com/9.1/pythonapi/parameters.html#doc-all-parameter-list.
            NMSK_DPAR_MIO_MAX_TIMEzGtimeLimit parameter has been provided trough `timeLimit` and `options`.)mipmsgr   task_file_namesolution_typer   mosekdparammio_max_time
isdisjointkeys
ValueError)selfr   r   r   r   r   sol_typetimeLimit_keyss           y/var/www/html/SchoolMeal/SchoolMeal/pds_admin_SchoolMeal/Backend/venv/lib/python3.12/site-packages/pulp/apis/mosek_api.py__init__zMOSEK.__init__7   s    H DHDH&DN"0D!)D"DL~~)"95<<;T;T!U%001B1B1DE$a  9=45 *    c                      y)True if Mosek is available.T r   s    r   	availablezMOSEK.availablek   s    r   c                 ~    t         j                  j                  |       t         j                  j                          y)zSets the log-output stream.N)sysstdoutwriteflush)r   texts     r   setOutStreamzMOSEK.setOutStreamo   s$    JJT"JJr   c           
         |j                   | _        t        | j                        | _        i | _        d}| j                  D ]  }|| j                  |<   |dz   } t        |j                               | _        t        | j                        | _        i | _	        |j                          t        j                  j                         | _        | j                  j                  | j                         | j                  j!                  | j                         | j"                  r>| j                  j%                  t&        j(                  j*                  | j,                         t/        | j                        D ]@  }| j                  |   j0                  }|| j                  |<   | j                  j3                  ||       | j4                  | j                  |   j6                  t8        j:                  k(  z  rS| j                  j=                  |t&        j>                  j@                         t&        jB                  jD                  | _#        t&        jH                  jJ                  }|}| }| j                  |   jL                  dk7  r| j                  |   jL                  }| j                  |   jN                  dk7  r4| j                  |   jN                  }t&        jH                  jP                  }njt&        jH                  jR                  }nO| j                  |   jN                  dk7  r3| j                  |   jN                  }t&        jH                  jT                  }| j                  jW                  ||||       | j                  jY                  ||jZ                  j]                  | j                  |   d             C t_        |ja                         D 	
cg c]%  \  }	}
}| j                  |
   | j                  |	   |g' c}}
}	 \  | _1        | _2        | _3        | j                  ji                  | jb                  | jd                  | jf                         g | _5        | j                  D ]u  }| j                  |   j0                  }|dk7  r*| j                  jm                  | j                  |   |       n)| j                  jm                  | j                  |   |       | j                  |   jn                  }| j                  |   jp                   }| }|}|t8        jr                  k(  rt&        jH                  jt                  }|}|}nk|t8        jv                  k(  rt&        jH                  jR                  }|}n;|t8        jx                  k(  rt&        jH                  jT                  }|}nt{        d      | jj                  j}                  | j                  |   |||g       x t_        | jj                   \  | _?        | _@        | _A        | _B        | j                  j                  | j~                  | j                  | j                  | j                         |jn                  t8        j                  k(  r4| j                  j                  t&        j                  j                         y| j                  j                  t&        j                  j                         yc c}}
}	w )z/Translate the problem into a Mosek task object.r   r   N        Invalid constraint type.)Iconstraintsconslennumcons	cons_dictlist	variablesvarsnumvarsvar_dictcheckDuplicateVarsr
   envTasktask
appendcons
appendvarsr   
set_Streamr   
streamtypelogr+   rangename
putvarnamer   catr   	LpInteger
putvartypevariabletypetype_intsoltypeitgr   boundkeyfrlowBoundupBoundraloupputvarboundputcj	objectivegetzipcoefficientsA_rowsA_colsA_vals
putaijlistconstraint_data_list
putconnamesenseconstantLpConstraintEQfxLpConstraintGELpConstraintLEr   appendcons_id_list
cbkey_list	clow_listcup_listputconboundlist
LpMaximizeputobjsenseobjsensemaximizeminimize)r   lpinficvnamevbkeyvupvlowcolrowcoeffcnamecsensecconstclowcupcbkeys                     r   buildSolverModelzMOSEK.buildSolverModelt   s   DItyy>DLDNAYY $%q!E R\\^,DItyy>DLDM!!#		(DIII  .II  .xx		$$U%5%5%9%94;L;LM4<<( H		!))'(e$		$$Q.88tyy|//93F3FFGII((E,>,>,G,GH).):):D&))t99Q<((D099Q<00Dyy|++t3"iil22 % 1 1 % 1 1YYq\))T1))A,..C!NN--E		%%ac:		2<<#3#3DIIaL##FG1H4 58 ,.??+< 'S% ^^C($--*<eD51DKdk II  dkk4;;G(*D%YY X		!))D=II(():EBII(():A>1++))A,///tY555!NN--E!D Cy777!NN--E!Dy777!NN--E C)*DEE))00$..2CUDRU1VW/X0 QT**QMDt II%%!!4??DNNDMM xx9///		%%enn&=&=>		%%enn&=&=>Us   *[c                 $	   | j                   j                  | j                        | _        t        j                  j
                  t        j                  t        j                  j                  t        j                  t        j                  j                  t        j                  t        j                  j                  t        j                  t        j                  j                  t        j                  t        j                  j                  t        j                   t        j                  j"                  t        j                   t        j                  j$                  t        j                   t        j                  j&                  t        j                   t        j                  j(                  t        j                   i
| _        	 dg| j,                  z  | _        | j                   j1                  | j                  | j.                         |j3                         D ]-  }| j.                  | j4                  |j6                        |_        / 	 	 dg| j<                  z  | _        | j                   jA                  | j                  | j>                         |jB                  D ]K  }| jD                  |   jF                  | j>                  | jH                  |      z    |jB                  |   _%        M 	 | j                  t        jL                  jN                  k7  r	 dg| j,                  z  | _(        | j                   jS                  | j                  d| j,                  | jP                         |j3                         D ]-  }| jP                  | j4                  |j6                        |_*        / 	 	 dg| j<                  z  | _+        | j                   jY                  | j                  | jV                         |jB                  D ]0  }| jV                  | jH                  |      |jB                  |   _-        2 yy# t        j:                  $ r Y w xY w# t        j:                  $ r Y rw xY w# t        j:                  $ r Y w xY w# t        j:                  $ r Y yw xY w)aq  
            Read the solution values and status from the Mosek task object. Note: Since the status
            map from mosek.solsta to LpStatus is not exact, it is recommended that one enables the
            log output and then refer to Mosek documentation for a better understanding of the
            solution (especially in the case of mip problems).
            r-   r   N).r<   	getsolstar   solstar   optimalr   LpStatusOptimalprim_infeas_cerLpStatusInfeasibledual_infeas_cerLpStatusUnboundedunknownLpStatusUndefinedinteger_optimalprim_illposed_cerLpStatusNotSolveddual_illposed_cer	prim_feas	dual_feasprim_and_dual_feassolution_status_dictr7   xxgetxxr5   r8   rC   varValueErrorr2   xcgetxcr/   r0   r`   r3   slackrJ   rK   x_rcgetreducedcostsdjygetypi)r   rp   varcons       r   findSolutionValueszMOSEK.findSolutionValues   sA    ))--d.@.@ADK$$i&?&?,,i.J.J,,i.I.I$$i&A&A,,i.G.G..	0K0K..	0K0K&&	(C(C&&	(C(C//1L1L)D%%$,,.		 2 2DGG<<<> DC#'774==+B#CCLD
%$,,.		 2 2DGG<>> C		#//$''$..:M2NN1BNN3'- !!U]]%6%66!$ 4DIII--**At||TYY  "||~ D!%4==+B!CD
!UT\\1DFIINN4#5#5tvv>!~~ M15s8K1Ls+.M 7 ;;  ;;  {{  {{ sL   BP, 
BQ BQ  &BQ9 ,QQQQ Q65Q69RRc                    t        |t        j                        r| j                  j	                  ||       yt        |t        j
                        r| j                  j                  ||       yt        |t        j                        r| j                  j                  ||       yt        |t              r|j                  d      r| j                  j                  ||       y|j                  d      r| j                  j                  ||       y|j                  d      r| j                  j                  ||       yt        dj                  |            y)zG
            Pass the values of valid parameters to Mosek.
            	MSK_DPAR_	MSK_IPAR_	MSK_SPAR_zXInvalid MOSEK parameter: '{}'. Check MOSEK documentation for a list of valid parameters.N)
isinstancer   r   r<   putdouparamiparamputintparamsparamputstrparamstr
startswithputnadouparamputnaintparamputnastrparamr   format)r   parvals      r   putparamzMOSEK.putparam	  s     #u||,		%%c3/C.		%%c3/C.		%%c3/C%>>+.II++C5^^K0II++C5^^K0II++C5)ryy  &r   c                    | j                  |       | j                  D ]!  }| j                  || j                  |          # | j                  r%| j                  j                  | j                         | j                  j                          | j                  r3| j                  j                  t        j                  j                         | j                  |       |j                  | j                  | j                            |j                         D ]	  }d|_         |j"                  j%                         D ]	  }d|_         |j&                  S )z=
            Solve a well-formulated lp problem.
            F)r   r   r   r   r<   	writedataoptimizer   solutionsummaryr   r@   r   assignStatusr   r   r5   modifiedr/   valuesstatus)r   rp   msk_parr   r   s        r   actualSolvezMOSEK.actualSolve!  s    !!"%<< >gt||G'<=> ""		##D$7$78II xx		))%*:*:*>*>?##B'OOD55dkkBC||~ %$%~~,,. %$%99r   c                    | j                   D ]  }| j                   |   j                  s| j                   |   j                  }| j                   |   j                   }| }|}|t        j
                  k(  rt        j                  j                  }	|}|}nk|t        j                  k(  rt        j                  j                  }	|}n;|t        j                  k(  rt        j                  j                  }	|}nt        d      | j                  j                  | j                   |   |	||         | j                  j#                          | j%                  |       |j'                  | j(                  | j*                            |j-                         D ]	  }
d|
_         |j.                  j1                         D ]	  }d|_         |j2                  S )zz
            Modify constraints and re-solve an lp. The Mosek task object created in the first solve is used.
            r.   F)r0   r   r_   r`   r   ra   r   rL   rb   rc   rQ   rd   rR   r   r<   putconboundr3   r   r   r   r   r   r5   r/   r   r   )r   rp   rq   kwargsrs   r|   r}   r~   r   r   r   r   s               r   actualResolvezMOSEK.actualResolve9  s{    YY O99Q<((!YYq\//F"iil333F4DC!9!99 % 1 1%$9#;#;; % 1 1%9#;#;; % 1 1$-.HIIII))$..*;UD#N'O* II ##B'OOD55dkkBC||~ %$%~~,,. %$%99r   c                      y)r!   Fr"   r#   s    r   r$   zMOSEK.available-   s    r   c                     t        d      )z$Solves a well-formulated lp problem.zMOSEK : Not Available)r   )r   rp   callbacks      r   r   zMOSEK.actualSolve1   s    !"9::r   )g@xD)N)__name__
__module____qualname____doc__rC   r   Envr:   rJ   basr   floatdictr   r$   r+   r   r   r   r   r   ImportErrorr"   r   r   r
   r
   "   s    <Dsiik )-&*]]&&2	G  	2	G
 d^2	Gh		
Y	?v8	t	0	0 	]  ;		;;s   A' 'A65A6r
   )	corer   r   r   r   r&   typingr   r
   r"   r   r   <module>r      s!   6 ,  
 wH wr   