
    lh?                    V   d Z ddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddl ddlmZ ddlmZ dd	lmZ 	 ddlZd
Zej9                  dd      Zej9                  dd      Zd Zd Z  G d d      Z! G d de!jD                        Z# G d de!jD                        Z$ G d de!jD                        Z% G d de!jD                        Z& G d de!jD                        Z' G d de!jD                        Z( G d de!jD                        Z) G d  d!e!jD                        Z* G d" d#e!jD                        Z+ G d$ d%e!jD                        Z, G d& d'e!jD                        Z- G d( d)e!jD                        Z. G d* d+e!jD                        Z/ G d, d-e!jD                        Z0 G d. d/e!jD                        Z1 G d0 d1e!jD                        Z2 G d2 d3e!jD                        Z3 G d4 d5e!jD                        Z4 G d6 d7e!jD                        Z5 G d8 d9e!jD                        Z6 G d: d;e!jD                        Z7 G d< d=      Z8 G d> d?e!jD                  e8      Z9 G d@ dAe!jD                  e8      Z:	 	 	 	 	 	 	 dEdBZ;dFdCZ<e=dDk(  r ej|                          yy# e$ r dZY Vw xY w)Gz
Tests for pulp
    N)LpAffineExpressionLpConstraintLpConstraintVarLpFractionConstraint	LpProblem
LpVariableFixedElasticSubProblem)	constants)lpSum)*)	PulpError)create_bin_packing_problem)makeDictaV  NAME          TESTPROB
ROWS
 N  COST
 L  LIM1
 G  LIM2
 E  MYEQN
COLUMNS
    XONE      COST                 1   LIM1                 1
    XONE      LIM2                 1
    YTWO      COST                 4   LIM1                 1
    YTWO      MYEQN               -1
    ZTHREE    COST                 9   LIM2                 1
    ZTHREE    MYEQN                1
RHS
    RHS1      LIM1                 5   LIM2                10
    RHS1      MYEQN                7
BOUNDS
 UP BND1      XONE                 4
 LO BND1      YTWO                -1
 UP BND1      YTWO                 1
ENDATA
z#LO BND1      YTWO                -1z#PL BND1      YTWO                  z#MI BND1      YTWO                  c                 B     t        j                          fd       }|S )Nc                    | j                   j                  dvr | g|i |S t        t        j                  d      	  | g|i |S # t        j
                  $ r}|j                  t        j                  j                  j                  k(  rt        j                  d      |j                  t        j                  j                  j                  k(  rt        j                  d       d }~ww xY w)N)GUROBI
GUROBI_CMDz No gurobipy, can't check licensezSize-limited Gurobi licensezNo Gurobi license)solvernamegpunittestSkipTestGurobiErrorerrnoGRBErrorSIZE_LIMIT_EXCEEDED
NO_LICENSE)test_objargskwargsge	test_items       z/var/www/html/SchoolMeal/SchoolMeal/pds_admin_SchoolMeal/Backend/venv/lib/python3.12/site-packages/pulp/tests/test_pulp.pyskip_wrapperz!gurobi_test.<locals>.skip_wrapperB   s    ##'??X7777:##$FGG		X7777~~ 	xx266<<;;;''(EFFxx266<<222''(;<<	s   A C3!BC..C3)	functoolswraps)r#   r%   s   ` r$   gurobi_testr(   A   s&    __Y  "     c                 X    	 | j                  d       | j                  d       y #  Y y xY w)Nzdebug.lpz	debug.mps)writeLPwriteMPSprobs    r$   dumpTestProblemr/   W   s)    Z k"s   "% )c                   6    e Zd Z G d dej                        Zy)BaseSolverTestc                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0d/ Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;d: Z<d; Z=d< Z>d= Z?d> Z@eAd?        ZBeAd@        ZCdA ZDdB ZEdC ZFdD ZGdE ZHdF ZIdG ZJdH ZKdI ZLdJ ZMdK ZNdL ZOdM ZPdN ZQdO ZRy)PBaseSolverTest.PuLPTestNc                     | j                  d      | _        | j                  j                         s*| j                  d| j                   j                   d       y y )NFmsgzsolver z not available)	solveInstr   	availableskipTestr   )selfs    r$   setUpzBaseSolverTest.PuLPTest.setUpc   sI    ..U.3DK;;((*(;(;'<NKL +r)   c                 n    dD ])  }| j                    d| }	 t        j                  |       + y #  Y 1xY w)N)mstloglpmpssol.)_testMethodNameosremove)r:   extfilenames      r$   tearDownz BaseSolverTest.PuLPTest.tearDownh   sH    9 "2231SE:IIh' s   04c                     t        ddd      }t        ddd      }t        dd      }||z   dk  }||z   |z
  }t        |      sJ ||   dk(  sJ y	)
zT
            Test that a variable is deleted when it is subtracted to 0
            xr      y   z   N)r   str)r:   rJ   rL   rO   c1c2s         r$   test_variable_0_is_deletedz2BaseSolverTest.PuLPTest.test_variable_0_is_deletedq   sa     31%A3A&A3"AQ!Ba!Br7N7a5A::r)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|t        |fD cg c]  } c}      dk\  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }| j                  j                  t        t        fv r2t        || j                  t        j                  g|d|d|d|did       y | j                  j                  t        t        fv ry t        || j                  t        j                  t        j                  t        j                  g       y c c}w )NrJ   r   rK   rL   rM   rN   rO   w	   objFrP   rR   
   rS      c3c4   use_mps)r   rC   const
LpMinimizer   r   r   	__class__PULP_CBC_CMDCOIN_CMDpulpTestCheckLpStatusInfeasible	CHOCO_CMD	MIPCL_CMDLpStatusNotSolvedLpStatusUndefined)r:   r.   rJ   rL   rO   rV   vs          r$   test_infeasiblez'BaseSolverTest.PuLPTest.test_infeasible}   s}   T1153C3CDD31%A3A&A3"A3"AAAIA%u,,D1#/Q/0A5 D AERK%%DQBFaK%%DAFDL D{{$$x(@@KK--.1b!Q1-! &&9i*@@KK00////' 0s   5E+
c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }t        || j                  t        j                  g|d|d|d|di       y )NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   r]   r   rC   r`   ra   r   re   r   LpStatusOptimalr:   r.   rJ   rL   rO   rV   s         r$   test_continuousz'BaseSolverTest.PuLPTest.test_continuous   s    T1153C3CDD31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL DdkkE$9$9#:Q1b!QPQST<Ur)   c           	         t        | j                  t        j                        }t	        d      D ci c]  }|t        d| dt               c}|t        fdt	        d      D              dk\  z  }|t        fdt	        d      D              dk  z  }|j                  j                         D ]   }| j                  |j                  d	d
g       " y c c}w )N   rJ   r   lowBoundcatc              3   (   K   | ]	  }|     y wN .0ix_varss     r$   	<genexpr>zDBaseSolverTest.PuLPTest.test_non_intermediate_var.<locals>.<genexpr>        6&)6      c              3   (   K   | ]	  }|     y wrx   ry   rz   s     r$   r~   zDBaseSolverTest.PuLPTest.test_non_intermediate_var.<locals>.<genexpr>   r   r   rP   r   rC   r`   ra   ranger   LpContinuousr   constraintsvaluesassertInconstant)r:   r.   r|   elemr}   s       @r$   test_non_intermediate_varz1BaseSolverTest.PuLPTest.test_non_intermediate_var   s    T1153C3CDDNSTUhIJ:!g|DDF E6U1X66!;;DE6U1X66!;;D((//1 7dmmb"X67s   Cc           	         t        | j                  t        j                        }t	        d      D ci c]  }|t        d| dt               c}t        fdt	        d      D              }||dk\  z  }||dk  z  }|j                  j                         D ]   }| j                  |j                  dd	g       " y c c}w )
Nrs   rJ   r   rt   c              3   (   K   | ]	  }|     y wrx   ry   rz   s     r$   r~   z@BaseSolverTest.PuLPTest.test_intermediate_var.<locals>.<genexpr>        2AfQi2r   r   rP   r   r   r   )r:   r.   r|   rJ   r   r}   s        @r$   test_intermediate_varz-BaseSolverTest.PuLPTest.test_intermediate_var   s    T1153C3CDDNSTUhIJ:!g|DDF 2q22AAFNDAFND((//1 7dmmb"X67s   B>c           	         t        | j                  t        j                        }t	        d      D ci c]  }|t        d| dt               c}t        fdt	        d      D              }| j                  t              5  ||dkD  z  }d d d        | j                  t              5  ||dk  z  }d d d        y c c}w # 1 sw Y   5xY w# 1 sw Y   y xY w)Nrs   rJ   r   rt   c              3   (   K   | ]	  }|     y wrx   ry   rz   s     r$   r~   z:BaseSolverTest.PuLPTest.test_comparison.<locals>.<genexpr>   r   r   r   rP   )
r   rC   r`   ra   r   r   r   r   assertRaises	TypeError)r:   r.   r|   rJ   r}   s       @r$   test_comparisonz'BaseSolverTest.PuLPTest.test_comparison   s    T1153C3CDDNSTUhIJ:!g|DDF 2q22A""9- A""9- A 
  s   B=	C+	CCCc                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }t        || j                  t        j                  g|d|d|d|di       y )NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\      )r   rC   r`   
LpMaximizer   re   r   ro   rp   s         r$   test_continuous_maxz+BaseSolverTest.PuLPTest.test_continuous_max   s    T1153C3CDD31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL DdkkE$9$9#:Q1aAqRS<Tr)   c                 ^   t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   |z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }| j
                  j                  t        t        t        t        t        fv r6t        || j
                  t        j                  t        j                  g       y | j
                  j                  t        t         fv r't        || j
                  t        j"                  g       y | j
                  j                  t$        u r't        || j
                  t        j&                  g       y | j
                  j                  t(        t*        t,        fv r't        || j
                  t        j.                  g       y | j
                  j                  t0        t2        t4        fv ry t        || j
                  t        j                  g       y )NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   )r   rC   r`   r   r   r   rb   r   	CPLEX_CMDYAPOSIBMOSEKCOPTre   rf   LpStatusUnbounded
COINMP_DLLrh   ro   GLPK_CMDrj   r   SCIP_CMDSCIP_PYri   rg   	HiGHS_CMD	FSCIP_CMDrp   s         r$   test_unboundedz&BaseSolverTest.PuLPTest.test_unbounded   s   T1153C3CDD31%A3A&A3"A3"AAAIA%)500DAEQJ$$DAERK%%DQBFaK%%DAFDL D{{$$GUD(QQKK--u/F/FG
 &&:y*AA dDKK%2G2G1HI&&(2dDKK%2I2I1JK&&:x*IIdDKK%2I2I1JK&&9i*KK dDKK%2I2I1JKr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }| j
                  j                  t        t        t        t        t        t        t        t        t        t         t"        t$        t&        fv r1	 t)        || j
                  t        j*                  g|d|d|d|di       y t)        || j
                  t        j*                  g|d|d|d|di       y # t,        $ r Y y w xY w)Nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   r]   )r   rC   r`   ra   r   r   rb   r   r   r   rh   r   r   r   HiGHSr   XPRESS
XPRESS_CMDSAS94SASCASre   ro   r   rp   s         r$   test_long_var_namez*BaseSolverTest.PuLPTest.test_long_var_name  s   T1153C3CDD9a+A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D{{$$) 	!../Aq"aAq1	 KK**+1b!Q1-		 ! s   6/E 	E"!E"c                     t         j                  t        j                        t	        ddd      t	        ddd      t	        dd      t	        dd      dz  z   dz  z   d	fz  z   d
k  dfz  z   dk\  dfz   z   dk(  dfz  dk\  dfz   j
                  j                  t        t        t        t        t        t        t        t        t        t         t"        t$        t&        t(        t*        t,        t.        t0        t2        fv r! fd} j5                  t6        |       y t9         j
                  t        j:                  gddddi       y )NrJ   r   rK   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   c                  b    t         j                  t        j                  gddddi      S )NrK   rM   r]   r   )re   r   r`   ro   )r.   r:   rV   rJ   rL   rO   s   r$   my_funcz;BaseSolverTest.PuLPTest.test_repeated_name.<locals>.my_funcR  s:    (../Aq"aAq1	 r)   r]   )r   rC   r`   ra   r   r   rb   rd   r   rc   r   CPLEX_PYr   r   rg   rh   r   r   r   r   r   r   	XPRESS_PYr   r   CYLPr   r   re   ro   )r:   r   r.   rV   rJ   rL   rO   s   ` @@@@@r$   test_repeated_namez*BaseSolverTest.PuLPTest.test_repeated_name1  sf   T1153C3CDD31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D{{$$') ,  !!)W5KK**+1b!Q1-	r)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|t        ddg      dk  dfz  }t        || j                  t        j                  g|d|d|d|di       y )NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   c5r]   	r   rC   r`   ra   r   r   re   r   ro   rp   s         r$   test_zero_constraintz,BaseSolverTest.PuLPTest.test_zero_constraintc  s   T1153C3CDD31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL DE1a&MQ&,,DdkkE$9$9#:Q1b!QPQST<Ur)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }|||z   d	k  d
fz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|t        ddg      dk  dfz  }t        || j                  t        j                  g       y NrJ   r   rK   rL   rM   rN   rO   rV   rP   rR   rY   rS   rZ   r[   r\   r   r   rp   s         r$   test_no_objectivez)BaseSolverTest.PuLPTest.test_no_objectives  s    T1153C3CDD31%A3A&A3"A3"AAEQJ$$DAERK%%DQBFaK%%DAFDL DE1a&MQ&,,D$e.C.C-DEr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }|j                  |       |||z   d	k  d
fz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|t        ddg      dk  dfz  }t        || j                  t        j                  g       y r   )
r   rC   r`   ra   r   setObjectiver   re   r   ro   rp   s         r$   test_variable_as_objectivez2BaseSolverTest.PuLPTest.test_variable_as_objective  s    T1153C3CDD31%A3A&A3"A3"Aa AEQJ$$DAERK%%DQBFaK%%DAFDL DE1a&MQ&,,D$e.C.C-DEr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }| j
                  j                  t        t        fv r2t        || j
                  t        j                  g|d|d|d|did       y y )NZxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr   rK   ZyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyrM   rN   ZzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzZwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwrW   rX   rP   rR   rY   rS   rZ   r[   r\   r]   Fr^   )r   rC   r`   ra   r   r   rb   rc   rd   re   ro   rp   s         r$   test_longname_lpz(BaseSolverTest.PuLPTest.test_longname_lp  s   T1153C3CDD8Q*A8R+A8Q'A8Q'AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D{{$$x(@@KK**+1b!Q1-! Ar)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|d|z  d|z  z   dz  dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }t        || j                  t        j                  g|d|d|d|di       y )NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   r          @rP   rR   rY   rS   rZ   r[   r\   r]   rn   rp   s         r$   test_dividez#BaseSolverTest.PuLPTest.test_divide  s   T1153C3CDD31%A3A&A3"A3"AAAIA%u,,Da!ea!ems*q0$66DAERK%%DQBFaK%%DAFDL DdkkE$9$9#:Q1b!QPQST<Ur)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        ddd t        j
                        }||d|z  z   d|z  z   d	fz  }|||z   d
k  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }t        || j                  t        j                  g|d|d|di       y )NrJ   r   rK   rL   rM   rN   rO   rW   rX   rP   rR   rY   rS         @r[   rs         rZ   	r   rC   r`   ra   r   	LpIntegerre   r   ro   r:   r.   rJ   rL   rO   s        r$   test_mipz BaseSolverTest.PuLPTest.test_mip  s    T1153C3CDD31%A3A&A349AAAIA%u,,DAEQJ$$DAERK%%DQBFcM4''DdkkE$9$9#:Q1dAq<Qr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        ddd t        j
                        }|d|z  d	|z  z   d
|z  z   dfz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }t        || j                  t        j                  g|d|d|did       y )NrJ   r   rK   rL   rM   rN   rO   皙?ffffff@333333"@rX   rP   rR   rY   rS   r   r[   rs   r   rZ   g<P@)	objectiver   r   s        r$   test_mip_floats_objectivez1BaseSolverTest.PuLPTest.test_mip_floats_objective  s    T1153C3CDD31%A3A&A349AC!GcAg%a/66DAEQJ$$DAERK%%DQBFcM4''D&&'Aq$1%r)   c                 P   t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        ddd t        j
                        }||d|z  z   d|z  z   d	fz  }|||z   d
k  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }|j                  d       |j                  d       |j                  d       | j                  j                  dv rd| j                  j                  d<   t        || j                  t        j                  g|d|d|di       y )NrJ   r   rK   rL   rM   rN   rO   rW   rX   rP   rR   rY   rS   r   r[   rs   r   rZ   )r   r   r   r   r   r   r   r   T	warmStart)r   rC   r`   ra   r   r   setInitialValuer   r   optionsDictre   ro   r   s        r$   test_initial_valuez*BaseSolverTest.PuLPTest.test_initial_value  s3   T1153C3CDD31%A3A&A349AAAIA%u,,DAEQJ$$DAERK%%DQBFcM4''Da d#a {{ 	$ 	 8<''4dkkE$9$9#:Q1dAq<Qr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        ddd t        j
                        }||d|z  z   d|z  z   d	fz  }|||z   d
k  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }|d|d|di}|||fD ]&  }|j                  ||          |j                          ( d| j                  j                  d<   t        || j                  t        j                  g|       y )NrJ   r   rK   rL   rM   rN   rO   rW   rX   rP   rR   rY   rS   r   r[   r   rZ   Tr   )r   rC   r`   ra   r   r   r   fixValuer   r   re   ro   )r:   r.   rJ   rL   rO   solutionrk   s          r$   test_fixed_valuez(BaseSolverTest.PuLPTest.test_fixed_value  s$   T1153C3CDD31%A3A&A349AAAIA%u,,DAEQJ$$DAERK%%DQBFcM4''D1aq!,HAY !!(1+.

 48DKK##K0$e.C.C-DhOr)   c                 |   t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        ddd t        j
                        }||d|z  z   d|z  z   d	fz  }|||z   d
k  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }d| j                  _        | j                  j                  t        t        t        t        t        t        t        fv r.t!        || j                  t        j"                  g|d|d|di       y t!        || j                  t        j"                  g|d|d|di       y )NrJ   r   rK   rL   rM   rN   rO   rW   rX   rP   rR   rY   rS   r   r[   g      @r   rZ   g      @g      @)r   rC   r`   ra   r   r   r   miprb   r   rg   rh   r   r   r   r   re   ro   r   s        r$   test_relaxed_mipz(BaseSolverTest.PuLPTest.test_relaxed_mip  sF   T1153C3CDD31%A3A&A349AAAIA%u,,DAEQJ$$DAERK%%DQBFcM4''DDKKO{{$$)  $++(=(='>CDRSUV@W $++(=(='>CBPQSV@Wr)   c                 T   t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        ddd t        j
                        }|||z   dk  d	fz  }|||z   d
k\  dfz  }|| |z   dk(  dfz  }t        || j                  t        j                  g       y )NrJ   r   rK   rL   rM   rN   rO   rP   rR   rY   rS   r   r[   r   r   s        r$   test_feasibility_onlyz-BaseSolverTest.PuLPTest.test_feasibility_only  s    T1153C3CDD31%A3A&A349AAEQJ$$DAERK%%DQBFcM4''D$e.C.C-DEr)   c                 N   t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        ddd      }|||z   d	k  d
fz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }| j
                  j                  t        u r't        || j
                  t        j                  g       y | j
                  j                  t        t        fv r't        || j
                  t        j                  g       y t        || j
                  t        j                  g       y )NrJ   r   rK   rL   rM   rN   rO   rY   @rR   皙$@rS   g     1@r[   )r   rC   r`   ra   r   r   rb   r   re   rj   r   r   ri   rf   r   s        r$   test_infeasible_2z)BaseSolverTest.PuLPTest.test_infeasible_2   s    T1153C3CDD31%A3A&A32&AAESL$&&DAETM4''DQBFdND((D{{$$0dDKK%2I2I1JK&&:y*AAdDKK%2I2I1JKdDKK%2J2J1KLr)   c                 x   t        | j                  t        j                        }t	        dddt        j
                        }t	        dddt        j
                        }t	        dddt        j
                        }|||z   d	k  d
fz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }| j                  j                  t        t        t        t        fv r6t        || j                  t        j                  t        j                  g       y | j                  j                  t        t         fv r't        || j                  t        j"                  g       y | j                  j                  t$        t&        fv r't        || j                  t        j(                  g       y t        || j                  t        j                  g       y )NrJ   r   rK   rL   rM   rN   rO   rY   r   rR   r   rS   g@r[   )r   rC   r`   ra   r   r   r   rb   r   rd   rc   r   re   rf   rj   r   r   ro   r   r   ri   r   s        r$   test_integer_infeasiblez/BaseSolverTest.PuLPTest.test_integer_infeasible1  s[   T1153C3CDD31eoo6A3Au7A32u7AAESL$&&DAETM4''DQBFcM4''D{{$$8\5(QQKK--u/F/FG
 &&:t*<< dDKK%2G2G1HI&&:y*AAdDKK%2I2I1JKdDKK%2J2J1KLr)   c                    t        | j                  t        j                        }t	        d      }t	        dddt        j
                        }t	        dddt        j
                        }||z  }|||z   dk(  z  }||dk  z  }| j                  j                  t        t        t        t        fv r't        || j                  t        j                  g       y | j                  j                  t        fv r6t        || j                  t        j                  t        j                   g       y t        || j                  t        j                  g       y )NdummyrR   r   rN   rS   r   )r   rC   r`   r   r   LpBinaryr   rb   r   r   r   r   re   ri   r   rf   rj   )r:   r.   r   rR   rS   s        r$   test_integer_infeasible_2z1BaseSolverTest.PuLPTest.test_integer_infeasible_2I  s    T1153C3CDDw'ED!Q7BD!Q7BEMDBGqL DB!GOD{{$$Xy'(RRdDKK%2I2I1JK&&8*4KK--u/F/FG dDKK%2J2J1KLr)   c                 |   t        | j                  t        j                        }t	        d      }t	        dt        j
                  d      }t	        dt        j                  d      }t	        dt        j                  d      }|j                  |       ||z  }||z  }||z  }t        dd	d
t        j                  ||z   |z         }t        dddt        j                  d
|z  |z   |z
        }t        dd	d t        j                  d|z  |z   |z         }t        || j                  t        j                  g|d
|d|di       y NrX   C1rP   C2rY   C3rZ   rJ   r   rK   rL   rM   rN   rO   rW   r]   )r   rC   r`   ra   r   LpConstraintLELpConstraintGELpConstraintEQr   r   r   re   r   ro   	r:   r.   rX   abcrJ   rL   rO   s	            r$   test_column_basedz)BaseSolverTest.PuLPTest.test_column_based_  s   T1153C3CDD!%(Ce&:&:A>Ae&:&:B?Ae&:&:A>Ac"AIDAIDAID31e&8&8#'A+FA3Au'9'91s7Q;?KA34););QWq[1_MAdkkE$9$9#:Q1b!Q<Or)   c                    t        | j                  t        j                        }t	        d      }t	        dt        j
                  d      }t	        dt        j                  d      }t	        dt        j                  d      }|j                  |       ||z  }||z  }||z  }t        dd	d
t        j                  ||z         }t        dddt        j                  d
|z  |z
        }t        dd	d t        j                  d|z  |z   |z         }| j                  j                  t        t        t        t         fv r.t#        || j                  t        j$                  g|d
|d|di       y y r   )r   rC   r`   ra   r   r   r   r   r   r   r   r   rb   r   r   r   PYGLPKre   ro   r   s	            r$   "test_colum_based_empty_constraintsz:BaseSolverTest.PuLPTest.test_colum_based_empty_constraintss  s6   T1153C3CDD!%(Ce&:&:A>Ae&:&:B?Ae&:&:A>Ac"AIDAIDAID31e&8&8#'BA3Au'9'91s7Q;GA34););QWq[1_MA{{$$J(PP$++(=(='>Aq"aQR@S Qr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }||z   dk  }||z   dk\  }| |z   d	k(  }||d
|z  z   d|z  z   dfz  }||dfz  }||dfz  }||dfz  }| j
                  j                  t        t        t        t        t        t        t        t        fv r@t        || j
                  t        j                   g|d
|d|di|d|d|didddddddd       yy)zW
            Test the reporting of dual variables slacks and reduced costs
            rJ   r   rP   rL   rM   rN   rO   rY   rZ   rK   rW   rX   rR   rS   r[   r]      r   )rR   rS   r[   r   )rA   reducedcostsdualsslacksN)r   rC   r`   ra   r   r   rb   r   r   rc   r   r   r   r   r   re   ro   )r:   r.   rJ   rL   rO   rR   rS   r[   s           r$   !test_dual_variables_reduced_costsz9BaseSolverTest.PuLPTest.test_dual_variables_reduced_costs  s?    T1153C3CDD31%A3A&A3"AQ!BQ"Ba1BAAIA%u,,DBHDBHDBHD{{$$	) 	 KK**+Aq"a+"#Q2q!!4!"!15"#1A6	r)   c                    t        | j                  t        j                        }t	        d      }t	        dt        j
                  d      }t	        dt        j                  d      }t	        dt        j                  d      }|j                  |       ||z  }||z  }||z  }|j                  | j                         t        dd	d
t        j                  ||z   |z         }t        dddt        j                  d
|z  |z   |z
        }|j                          t        dd	d t        j                  d|z  |z   |z         }| j                  j                  t        fv r|j                          y y )NrX   r   rP   r   rY   r   rZ   rJ   r   rK   rL   rM   rN   rO   rW   )r   rC   r`   ra   r   r   r   r   r   	setSolverr   r   r   resolverb   r   r   s	            r$   #test_column_based_modelling_resolvez;BaseSolverTest.PuLPTest.test_column_based_modelling_resolve  s,   T1153C3CDD!%(Ce&:&:A>Ae&:&:B?Ae&:&:A>Ac"AIDAIDAIDNN4;;'31e&8&8#'A+FA3Au'9'91s7Q;?KALLN34););QWq[1_MA{{$$4 5r)   c           	         t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        ddd      }|d|z  z   d|z  z   }d|z  d|z  z
  d|z  z   }||dk  dfz  }| j
                  j                  t        t        fv r]|j                  ||g| j
                        }t        || j
                  t        j                  t        j                  gg|d|di|       y	y	)
zJ
            Test the ability to sequentially solve a problem
            rJ   r   rN   rL   rO   rR   )r   )rA   statusN)r   rC   r`   ra   r   r   rb   r   r   sequentialSolvere   ro   )r:   r.   rJ   rL   rO   obj1obj2r
  s           r$   test_sequential_solvez-BaseSolverTest.PuLPTest.test_sequential_solve  s    
 T1153C3CDD31%A31%A31%Aq1u9q1u$Dq51q5=1q5(DAFDL D{{$$V(<<--tTl4;;-OKK++U-B-BCDAq!! =r)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|t        ||t        j                  dd      z  }t        || j                  t        j                  g|d|d|d|di       y)zH
            Test the ability to use fractional constraints
            rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   g      ?r   r   g
@gUUUUUUտg@N)
r   rC   r`   ra   r   r   r   re   r   ro   rp   s         r$   test_fractional_constraintsz3BaseSolverTest.PuLPTest.test_fractional_constraints  s    T1153C3CDD31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D(Au/C/CStTTD&&'Ha1h1=	r)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        d      }||d|z  z   d	|z  z   |z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }|j                  |dk\  j                                t        || j                  t        j                  g|d|d|d|di       y)E
            Test the ability to use Elastic constraints
            rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r]   N
r   rC   r`   ra   r   extendmakeElasticSubProblemre   r   ro   rp   s         r$   test_elastic_constraintsz0BaseSolverTest.PuLPTest.test_elastic_constraints  s    T1153C3CDD31%A3A&A3"A3AAAIA%)500DAEQJ$$DAERK%%DQBFaK%%DKKb779:dkkE$9$9#:Q1b!QPQSU<Vr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        d      }||d|z  z   d	|z  z   |z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }|j                  |dk\  j                  d             t        || j                  t        j                  g|d|d|d|di       y)r  rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   皙?)proportionFreeBoundr]   gNr  rp   s         r$   test_elastic_constraints_2z2BaseSolverTest.PuLPTest.test_elastic_constraints_2  s    T1153C3CDD31%A3A&A3"A3AAAIA%)500DAEQJ$$DAERK%%DQBFaK%%DKKb77C7PQdkkE$9$9#:Q1b!QPQSW<Xr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        d      }||d|z  z   d	|z  z   |z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }|j                  |dk\  j                  d             t        || j                  t        j                  g|d|d|d|di       y)zY
            Test the ability to use Elastic constraints (penalty unchanged)
            rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r   penaltyr]   g      Nr  rp   s         r$   *test_elastic_constraints_penalty_unchangedzBBaseSolverTest.PuLPTest.test_elastic_constraints_penalty_unchanged  s    T1153C3CDD31%A3A&A3"A3AAAIA%)500DAEQJ$$DAERK%%DQBFaK%%DKKb777DEdkkE$9$9#:Q1b!QPQSW<Xr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        d      }||d|z  z   d	|z  z   |z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }|dk\  j                  d      }| j                  |j                  d       | j                  t        |j                        d       |j                  |       |j                  d   }|j                  d   }| j                  t        |      t        |             | j                  j                  t        t        t         t"        t$        t&        fv r6t)        || j                  t        j*                  t        j,                  g       y| j                  j                  t.        u r't)        || j                  t        j0                  g       y| j                  j                  t2        t4        fv r't)        || j                  t        j6                  g       y| j                  j                  t8        t:        fv ryt)        || j                  t        j,                  g       y)zY
            Test the ability to use Elastic constraints (penalty unbounded)
            rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   g?r  z,-0.9*_neg_penalty_var + 0.9*_pos_penalty_var_Constraint"None_elastic_SubProblem_ConstraintN)r   rC   r`   ra   r   r  assertEqualRHSrQ   r   r  r   r   rb   r   r   r   r   r   r   re   rf   r   r   rj   r   r   ri   rg   r   )	r:   r.   rJ   rL   rO   rV   sub_probelastic_constraint1elastic_constraint2s	            r$   *test_elastic_constraints_penalty_unboundedzBBaseSolverTest.PuLPTest.test_elastic_constraints_penalty_unbounded)  s;    T1153C3CDD31%A3A&A3"A3AAAIA%)500DAEQJ$$DAERK%%DQBFaK%%D01R/N/N 0O 0H X\\2.H&&')W KK!"*"6"6}"E"&"2"23W"XS!45s;N7OP{{$$)  KK--u/F/FG
 &&(2dDKK%2I2I1JK&&:x*@@dDKK%2I2I1JK&&9i*@@ dDKK%2I2I1JKr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|j                         }t        j                  |      \  }fddD        \  }}}}t        || j                  d      t        j                  g|d|d|d|di       y)zX
            Test setting the msg arg to True does not interfere with solve
            rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   c              3   (   K   | ]	  }|     y wrx   ry   r{   r   var1s     r$   r~   z7BaseSolverTest.PuLPTest.test_msg_arg.<locals>.<genexpr>o       F$t*Fr   rJ   rL   rO   rV   Tr5   r]   N)
r   rC   r`   ra   r   toDictfromDictre   r7   ro   	r:   r.   rJ   rL   rO   rV   dataprob1r,  s	           @r$   test_msg_argz$BaseSolverTest.PuLPTest.test_msg_arg_  s5    T1153C3CDD31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D;;=D#,,T2KD%F1EFJAq!Q4(&&'Aq"aAq)	r)   c                     ddl m} y)zK
            Test the availability of the function pulpTestAll
            r   )pulpTestAllN)pulpr6  )r:   r6  s     r$   test_pulpTestAllz(BaseSolverTest.PuLPTest.test_pulpTestAllw  s     )r)   c                 
   t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|j                         }t        j                  |      \  }fddD        \  }}}}t        || j                  t        j                  g|d|d|d|di       y )NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   c              3   (   K   | ]	  }|     y wrx   ry   r+  s     r$   r~   z>BaseSolverTest.PuLPTest.test_export_dict_LP.<locals>.<genexpr>  r-  r   r.  r]   
r   rC   r`   ra   r   r/  r0  re   r   ro   r1  s	           @r$   test_export_dict_LPz+BaseSolverTest.PuLPTest.test_export_dict_LP}  s+   T1153C3CDD31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D;;=D#,,T2KD%F1EFJAq!Qt{{U%:%:$;aAr1aQRTU=Vr)   c                    t        | j                  t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        ddd      }|||z   d	k\  d
fz  }|||z   dk(  dfz  }|| |z   dk  dfz  }||dk\  dfz  }|j                         }t        j                  |      \  }fddD        \  }}}}t        || j                  t        j                  g|d|d|d|di       y )NrJ   r   rK   rL   rM   rN   rO   rV   rP   rR   rY   rS   rZ   r[   r\   c              3   (   K   | ]	  }|     y wrx   ry   r+  s     r$   r~   zEBaseSolverTest.PuLPTest.test_export_dict_LP_no_obj.<locals>.<genexpr>  r-  r   r.  r]   r;  r1  s	           @r$   test_export_dict_LP_no_objz2BaseSolverTest.PuLPTest.test_export_dict_LP_no_obj  s   T1153C3CDD31%A3A&A3"A31%AAEQJ$$DAERK%%DQBFaK%%DAFDL D;;=D#,,T2KD%F1EFJAq!Qt{{U%:%:$;aAq!QPQST=Ur)   c                 l  	 | j                   }t        | j                   t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|dz   }|j                  |d       t        j                  |      \  	}	 t        j                  |       	fddD        \  }}}}t        || j                  t        j                  g|d|d|d|di       y #  Y DxY w)NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   .jsonindentc              3   (   K   | ]	  }|     y wrx   ry   r+  s     r$   r~   z>BaseSolverTest.PuLPTest.test_export_json_LP.<locals>.<genexpr>  r-  r   r.  r]   )rC   r   r`   ra   r   toJsonfromJsonrD   rE   re   r   ro   )
r:   r   r.   rJ   rL   rO   rV   rG   r3  r,  s
            @r$   test_export_json_LPz+BaseSolverTest.PuLPTest.test_export_json_LP  sb   ''DT1153C3CDD31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL Dg~HKKK+#,,X6KD%		(# G1EFJAq!Qt{{U%:%:$;aAr1aQRTU=Vs   D/ /D3c                 2  	 dd l }t        dt        j                        }t	        ddd      }t	        ddd      }t	        ddd t        j
                        }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }|j                         }|j                  |      }t        j                  |      \  	}	fddD        \  }}}t        || j                  t        j                  g|d|d|di       | j                  ||       y )Nr   test_export_dict_MIPrJ   rK   rL   rM   rN   rO   rW   rX   rP   rR   rY   rS   r   r[   c              3   (   K   | ]	  }|     y wrx   ry   r+  s     r$   r~   z?BaseSolverTest.PuLPTest.test_export_dict_MIP.<locals>.<genexpr>  s     >dtDz>r   )rJ   rL   rO   rs   r   rZ   )copyr   r`   ra   r   r   r/  deepcopyr0  re   r   ro   assertDictEqual)
r:   rK  r.   rJ   rL   rO   r2  data_backupr3  r,  s
            @r$   rI  z,BaseSolverTest.PuLPTest.test_export_dict_MIP  s+   3U5E5EFD31%A3A&A349AAAIA%u,,DAEQJ$$DAERK%%DQBFcM4''D;;=D---K#,,T2KD%>o>GAq!t{{U%:%:$;aAtQPQ=R   {3r)   c                    t        dt        j                        }t        ddd      }t        ddd      }t        dd      }t        d	d      }||d|z  z   d
|z  z   dfz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|j	                         }t        j
                  |      \  }fddD        \  }}}}t        || j                  t        j                  g|d|d|d|di       y )Ntest_export_dict_maxrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   c              3   (   K   | ]	  }|     y wrx   ry   r+  s     r$   r~   z?BaseSolverTest.PuLPTest.test_export_dict_max.<locals>.<genexpr>  r-  r   r.  r   )	r   r`   r   r   r/  r0  re   r   ro   r1  s	           @r$   rP  z,BaseSolverTest.PuLPTest.test_export_dict_max  s&   3U5E5EFD31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D;;=D#,,T2KD%F1EFJAq!Qt{{U%:%:$;aAq!QPQST=Ur)   c                    t        dt        j                        }t        ddd      }t        ddd      }t        dd      }t        d	d      }||d|z  z   d
|z  z   dfz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }| j                  j                         }t        |      }t        ||t        j                  g|d|d|d|di       y )Nr<  rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   r]   )	r   r`   ra   r   r   r/  getSolverFromDictre   ro   )r:   r.   rJ   rL   rO   rV   r2  solver1s           r$   test_export_solver_dict_LPz2BaseSolverTest.PuLPTest.test_export_solver_dict_LP  s	   2E4D4DED31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D;;%%'D'-Gg 5 56Aq"aAq8Qr)   c                 ,   | j                   }t        |t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }d| j
                  _        |dz   }| j
                  j                  dk(  r"t        ddddd|d      | j
                  _	        n7| j
                  j                  dv rt        ddd|d      | j
                  _	        |dz   }| j
                  j                  |d       t        |      }		 t        j                  |       t        ||	t        j                  g|d|d|d|di       y #  Y *xY w)NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   T.logr   r    )gapRelgapAbs	maxMemorymaxNodesthreadslogPathr   )r   rd   rc   )rY  rZ  r]  r^  r   rA  rB  r]   )rC   r   r`   ra   r   r   r   r   dictr   rE  getSolverFromJsonrD   rE   re   ro   )
r:   r   r.   rJ   rL   rO   rV   logFilenamerG   rT  s
             r$   test_export_solver_jsonz/BaseSolverTest.PuLPTest.test_export_solver_json  s   ''DT5#3#34D31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D"DKKO-K{{;.*."'"+' !!%OO*.q![TX+' g~HKKx2'1G		(# g 5 56Aq"aAq8Qs   F Fc                    | j                   }t        |t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }d| j
                  _        | j
                  j                  dk7  r0t        || j
                  t        j                  g|d|d|d|di       y y )NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\      rg   r]   )
rC   r   r`   ra   r   r   	timeLimitr   re   ro   r:   r   r.   rJ   rL   rO   rV   s          r$   test_timeLimitz&BaseSolverTest.PuLPTest.test_timeLimit  s!   ''DT5#3#34D31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D$&DKK!{{;.KK**+1b!Q1-	 /r)   c                     t        d      d| j                  t        j                  fd       | j                  t        j                  fd       y )Ntestic                  &    j                         S rx   assignStatusInvalidts   r$   <lambda>zBBaseSolverTest.PuLPTest.test_assignInvalidStatus.<locals>.<lambda>0  s    q~~g7N r)   c                  (    j                  d       S )Nr   rk  rm  s   r$   rp  zBBaseSolverTest.PuLPTest.test_assignInvalidStatus.<locals>.<lambda>1  s    q~~a7Q r)   )r   r   r`   r   )r:   rn  ro  s    @@r$   test_assignInvalidStatusz0BaseSolverTest.PuLPTest.test_assignInvalidStatus-  s<    &!AGeoo/NOeoo/QRr)   c                    | j                   }t        |t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|dz   }|| j
                  j                  d<   | j
                  j                  dv rt        || j
                  t        j                  g|d|d|d|di       t        j                  j                  |      st        d| j
                         t        j                  j                  |      st        d| j
                         y y )NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   rW  r^  )r   r   r   r   rc   rd   r]   Test failed for solver: )rC   r   r`   ra   r   r   r   r   re   ro   rD   pathexistsr   getsize)r:   r   r.   rJ   rL   rO   rV   ra  s           r$   test_logPathz$BaseSolverTest.PuLPTest.test_logPath3  s   ''DT5#3#34D31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D-K1<DKK##I.{{ $  KK**+1b!Q1-	 ww~~k2#&>t{{m$LMMww{3#&>t{{m$LMM 4!r)   c                     ddgddgg}ddgddgg}ddd	ddd	d
}t        ||d      }t        ||      }| j                  ||       | j                  ||       y)zK
            Test if makeDict is returning the expected value.
            ABCDrN   r   rs   rK   )r|  r}  )rz  r{  r   defaultN)r   r#  )r:   headersr   targetdict_with_defaultdict_without_defaults         r$   test_makeDict_behaviorz.BaseSolverTest.PuLPTest.test_makeDict_behaviorT  sz     SzC:.G!fq!f%F!"+2BCF (&! D#+GV#< .716:r)   c                     ddgddgg}ddgddgg}t        ||d	
      }t        ||      | j                  |d   d   d	       fd}| j                  t        |       y)zW
            Test if makeDict is returning a default value when specified.
            rz  r{  r|  r}  rN   r   rs   rK   r   r~  XYc                       d   d   S )Nr  r  ry   )r  s   r$   rp  zEBaseSolverTest.PuLPTest.test_makeDict_default_value.<locals>.<lambda>k  s    05c: r)   N)r   r#  r   KeyError)r:   r  r   r  _funcr  s        @r$   test_makeDict_default_valuez3BaseSolverTest.PuLPTest.test_makeDict_default_value`  su     SzC:.G!fq!f%F (&! D#+GV#< .s3C8!<:Eh.r)   c                    | j                   }t        |t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|dz   }|j                  |       t        j                  ||j                        \  }}	t        |      }
t        |	      }| j                  |
|       y )NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   .mpssense
rC   r   r`   r   r   r,   fromMPSr  getSortedDictrM  r:   r   r.   rJ   rL   rO   rV   rG   _varsprob2_dict1_dict2s               r$   test_importMPS_maximizez/BaseSolverTest.PuLPTest.test_importMPS_maximizen  s   ''DT5#3#34D31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL Df}HMM(#$,,XTZZHLE5"4(F"5)F  0r)   c                    | j                   }t        dt        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        d	d      }||d|z  z   d
|z  z   dfz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|dz   }|j                  |       t        j                  ||j                        \  }}	t        |      }
t        |	      }| j                  |
|       y )N rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   r  r  r  r  s               r$   test_importMPS_nonamez-BaseSolverTest.PuLPTest.test_importMPS_noname  s   ''DR!1!12D31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL Df}HMM(#$,,XTZZHLE5"4(F"5)F  0r)   c                    | j                   }t        |t        j                        }t	        ddd      }t	        ddd      }t	        ddd t        j
                        }|d|z  d	|z  z   d
|z  z   dfz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }|dz   }|j                  |       t        j                  ||j                        \  }}t        |      }	t        |      }
| j                  |	|
       y )NrJ   r   rK   rL   rM   rN   rO   r   r   r   rX   rP   rR   rY   rS   r   r[   r  r  )rC   r   r`   ra   r   r   r,   r  r  r  rM  )r:   r   r.   rJ   rL   rO   rG   r  r  r  r  s              r$   test_importMPS_integerz.BaseSolverTest.PuLPTest.test_importMPS_integer  s   ''DT5#3#34D31%A3A&A349AC!GcAg%a/66DAEQJ$$DAERK%%DQBFcM4''Df}HMM(#$,,XTZZHLE5"4(F"5)F  0r)   c                    | j                   }t        |t        j                        }t	        d      }t	        dddt        j
                        }t	        dddt        j
                        }||z  }|||z   dk(  z  }||dk  z  }|dz   }|j                  |       t        j                  ||j                  d	      \  }}t        |d
      }	t        |d
      }
| j                  |	|
       y )Nr   rR   r   rN   rS   r   r  T)r  dropConsNamesr   )keyCons)rC   r   r`   r   r   r   r,   r  r  r  rM  )r:   r   r.   r   rR   rS   rG   r  r  r  r  s              r$   test_importMPS_binaryz-BaseSolverTest.PuLPTest.test_importMPS_binary  s    ''DT5#3#34Dw'ED!Q7BD!Q7BEMDBGqL DB!GODf}HMM(#$,,

$LE5 #4<F"5*=F  0r)   c                 ~   t        j                  d      5 }|j                  t        j	                  t
                     ddd       t        j                  j                        \  }}t        j                  |j                         | j                  |j                  d   j                  d       y# 1 sw Y   txY w)z5Import MPS file with RHS definitions in fields 5 & 6.FdeleteNLIM2)tempfileNamedTemporaryFilewriterQ   encodeEXAMPLE_MPS_RHS56r   r  r   rD   unlinkr#  r   r   r:   h_problems       r$   test_importMPS_RHS_fields56z3BaseSolverTest.PuLPTest.test_importMPS_RHS_fields56  s    ,,E: 7a

#4567"**1662JAwIIaffW008AA3G	7 7s   )B33B<c                 X   t        j                  d      5 }|j                  t        j	                  t
                     ddd       t        j                  j                        \  }}t        j                  |j                         | j                  |t               y# 1 sw Y   axY w)z#Import MPS file with PL bound type.Fr  N)r  r  r  rQ   r  EXAMPLE_MPS_PL_BOUNDSr   r  r   rD   r  assertIsInstancer  s       r$   test_importMPS_PL_boundz/BaseSolverTest.PuLPTest.test_importMPS_PL_bound  su    ,,E: ;a

#89:;"**1662JAwIIaff!!'95	; ;s   )B  B)c                    t        j                  d      5 }|j                  t        j	                  t
                     ddd       t        j                  j                        \  }}t        j                  |j                         | j                  |t               |d   }| j                  |j                  d       y# 1 sw Y   xY w)z#Import MPS file with MI bound type.Fr  NYTWO)r  r  r  rQ   r  EXAMPLE_MPS_MI_BOUNDSr   r  r   rD   r  r  r#  ru   )r:   r  varsr  mi_vars        r$   test_importMPF_MI_boundz/BaseSolverTest.PuLPTest.test_importMPF_MI_bound  s    ,,E: ;a

#89:;%--aff5MD'IIaff!!'95&\FV__d3; ;s   )CC
c                    | j                   }t        |t        j                        }t	        d      }|d|z  z  }||dk\  z  }t        || j                  t        j                  g       | j                  |j                                y)ztGiven a valid problem that does not converge,
            assert that it is still categorised as valid.
            rJ   r   rN   N)
rC   r   r`   r   r   re   r   ro   
assertTruevalidr:   r   r.   rJ   s       r$   $test_unset_objective_value__is_validz<BaseSolverTest.PuLPTest.test_unset_objective_value__is_valid  so     ''DT5#3#34D3AAEMDAFND$e.C.C-DEOODJJL)r)   c                     | j                   }t        |t        j                        }t	        d      }|d|z  z  }||dk\  z  }| j                  |j                                y)zGiven an unbounded problem, where x will tend to infinity
            to maximise the objective, assert that it is categorised
            as invalid.rJ   rX  rN   N)rC   r   r`   r   r   assertFalser  r  s       r$   $test_unbounded_problem__is_not_validz<BaseSolverTest.PuLPTest.test_unbounded_problem__is_not_valid  sY     ''DT5#3#34D3AD1HDAFNDTZZ\*r)   c                    | j                   }t        |t        j                        }t	        d      }|d|z  z  }||dk\  z  }||dk  z  }| j
                  j                  dv rEt        || j
                  t        j                  t        j                  t        j                  g       n5t        || j
                  t        j                  t        j                  g       | j                  |j                                y)zzGiven a problem where x cannot converge to any value
            given conflicting constraints, assert that it is invalid.rJ   rN   r   )r   r   N)rC   r   r`   r   r   r   r   re   ri   rf   rj   r  r  r  s       r$   %test_infeasible_problem__is_not_validz=BaseSolverTest.PuLPTest.test_infeasible_problem__is_not_valid  s     ''DT5#3#34D3AAEMDAFNDAFND{{#>>KK//00// KK--u/F/FG
 TZZ\*r)   c                     t        | j                  t        j                        }d }| j	                  t
        ||       y )Nc                     | ddk(  z  } y )Nr   ry   r-   s    r$   	add_constz@BaseSolverTest.PuLPTest.test_false_constraint.<locals>.add_const  s    
"r)   r-   )r   rC   r`   ra   r   r   )r:   r.   r  s      r$   test_false_constraintz-BaseSolverTest.PuLPTest.test_false_constraint  s6    T1153C3CDD# i>r)   c                    d}t        ddddddddd	      }|j                  | j                  j                        }|y t	        |d      }|| j                  _        |j                  | j                        }d}|j                  }| j                  j                  dv r|j                  }| j                  |||d	| j                  j                   
       | j                  |j                         | j                  |j                  j                                | j                  |t        j                         |j!                         D ]  }| j                  |j"                          y )NrY      2   )	rc   rd   r   r   r   r   r   r   r   c   binsseedrd  )rc   rd   zoptimization time for solver )deltar6   )r_  getr   r   r   re  solvesolutionTimesolutionCpuTimeassertAlmostEqualassertIsNotNoner   valuer#  r`   ro   	variablesvarValue)	r:   
time_limitsolver_settingsr  r.   r
  r  reported_timerk   s	            r$   test_measuring_solving_timez3BaseSolverTest.PuLPTest.test_measuring_solving_time  sF   J"
O #&&t{{'7'78D|-4bAD$.DKK!ZZ,FE --M{{#?? $ 4 4""3DKK4D4D3EF	 #    0  !5!5!78VU%:%:;^^% 1$$QZZ01r)   c                    d}t        dddd      }|j                  | j                  j                        }|y t	        |d      }|| j                  _        |j                  | j                        }| j                  |j                  t        j                         | j                  |t        j                         | j                  |j                  t        j                         y )NrN   <   )r   r   rc   rd   r  r  )r_  r  r   r   r   re  r  r#  r
  r`   ri   
sol_statusLpSolutionNoSolutionFound)r:   r  r  r  r.   r
  s         r$   test_time_limit_no_solutionz3BaseSolverTest.PuLPTest.test_time_limit_no_solution2  s    J"RrUWXO"&&t{{'7'78D|-4bAD$.DKK!ZZ,FT[[%*A*ABVU%<%<=T__e.M.MNr)   c                    t        | j                  t        j                        }t	        d      }t	        d      }t	        ddd      }t	        d      }||d|z  z   d|z  z   d	fz  }|||z   d
k  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }| j
                  j                  dvr0t        || j
                  t        j                  g|d|d|d|di       y y )Nr   r   grM   rN   EndrK   rW   rX   rP   rR   rY   rS   rZ   r[   r   r\   )r   r   r   r]   )	r   rC   r`   ra   r   r   r   re   ro   )r:   r.   rJ   rV   rL   rO   s         r$   test_invalid_var_namesz.BaseSolverTest.PuLPTest.test_invalid_var_namesA  s   T1153C3CDD3A3A3A&A5!AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D{{ ( 
 KK**+1b!Q1-	r)   c                    g d}g d}t        j                  d||f      }|j                         D ]3  \  }}|j                         D ]  \  }}| j                  |t                 5 t        j                  d||f      }|j                         D ]3  \  }}|j                         D ]  \  }}| j                  |t                 5 t        j                  d||f      }|D ]  }|D ]  }| j                  |t                 ! t        j                  d||f      }|D ]  }|D ]  }| j                  |t                 ! y)zD
            Test that 'indexs' param continues to work
            rN   r   rs   rz  r{  r|  ri  r   indicesN)r   dictsitemsr  matrix)	r:   	customersagentsassign_varskrk   r   r   assign_vars_matrixs	            r$   test_LpVariable_indexs_paramz4BaseSolverTest.PuLPTest.test_LpVariable_indexs_paramX  s_    "I$F %**F@STK#))+ 91GGI 9DAq))!Z899
 %**6Iv3FGK#))+ 91GGI 9DAq))!Z899
 ",!2!2i%8" ( 9 9A))!Z899
 ",!2!26Iv;N!O' 9 9A))!Z899r)   c                    t        | j                  t        j                        }g d}g d}t	        j
                  d||f      }|j                         D ]3  \  }}|j                         D ]  \  }}| j                  |t                5 t	        j                  d||f      }	|	D ]  }|D ]  }| j                  |t                ! y)z<
            Test that 'indices' argument works
            r  r  ri  r  N)	r   rC   r`   ra   r   r  r  r  r  )
r:   r.   r  r  r  r  rk   r   r   r  s
             r$   test_LpVariable_indices_paramz5BaseSolverTest.PuLPTest.test_LpVariable_indices_paramy  s     T1153C3CDD!I$F %**F@STK#))+ 91GGI 9DAq))!Z899
 ",!2!2i%8" ( 9 9A))!Z899r)   c                    ddl m} d} ||      }t        j                  |      \  }}}}}}| j	                  t        d |j                         D                     | j	                  t        d |j                         D                     y)z^
            Ensures `readsol` can parse CPLEX mipopt solutions (see issue #508).
            r   )StringIOaD  <?xml version = "1.0" encoding="UTF-8" standalone="yes"?>
                <CPLEXSolution version="1.2">
                <header
                    problemName="mipopt_solution_example.lp"
                    solutionName="incumbent"
                    solutionIndex="-1"
                    objectiveValue="442"
                    solutionTypeValue="3"
                    solutionTypeString="primal"
                    solutionStatusValue="101"
                    solutionStatusString="integer optimal solution"
                    solutionMethodString="mip"
                    primalFeasible="1"
                    dualFeasible="1"
                    MIPNodes="25471"
                    MIPIterations="282516"
                    writeLevel="1"/>
                <quality
                    epInt="1.0000000000000001e-05"
                    epRHS="9.9999999999999995e-07"
                    maxIntInfeas="8.8817841970012523e-16"
                    maxPrimalInfeas="0"
                    maxX="48"
                maxSlack="141"/>
                <linearConstraints>
                    <constraint name="C1" index="0" slack="0"/>
                    <constraint name="C2" index="1" slack="0"/>
                </linearConstraints>
                <variables>
                    <variable name="x" index="0" value="42"/>
                    <variable name="y" index="1" value="0"/>
                </variables>
                <objectiveValues>
                    <objective index="0" name="x" value="42"/>
                </objectiveValues>
                </CPLEXSolution>
            c              3   $   K   | ]  }|d u  
 y wrx   ry   r{   r   s     r$   r~   zKBaseSolverTest.PuLPTest.test_parse_cplex_mipopt_solution.<locals>.<genexpr>       IaT	I   c              3   $   K   | ]  }|d u  
 y wrx   ry   r  s     r$   r~   zKBaseSolverTest.PuLPTest.test_parse_cplex_mipopt_solution.<locals>.<genexpr>  r  r  N)ior  r   readsolr  allr   )r:   r  file_contentsolution_filer  reducedCostsshadowPricess          r$    test_parse_cplex_mipopt_solutionz8BaseSolverTest.PuLPTest.test_parse_cplex_mipopt_solution  s~     $$LJ %\2M 6?5F5F}5U2Aq,a OOCI<3F3F3HIIJ OOCI<3F3F3HIIJr)   c                    | j                   }t        |t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }| j
                  j                  t        t        fv rCddg| j
                  _	        t        || j
                  t        j                  g|d|d|d|di       y | j
                  j                  t        fv rCddg| j
                  _	        t        || j
                  t        j                  g|d|d|d|di       y y )NrJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   zlimits/timerd  r]   r  )rC   r   r`   ra   r   r   rb   r   r   optionsre   ro   r   rf  s          r$   test_options_parsing_SCIP_HIGHSz7BaseSolverTest.PuLPTest.test_options_parsing_SCIP_HIGHS  s   ''DT5#3#34D31%A3A&A3"A3"AAAIA%u,,DAEQJ$$DAERK%%DQBFaK%%DAFDL D{{$$9(=='4b&9#KK**+1b!Q1-	 &&9+5'3R&8#KK**+1b!Q1-	 6r)   c                 r    dd l }|j                  t        d      | j                  t        fd       y )Nr   rJ   c                       z   S rx   ry   r   rJ   s   r$   rp  z=BaseSolverTest.PuLPTest.test_sum_nan_values.<locals>.<lambda>      Q r)   mathnanr   r   r   r:   r  r   rJ   s     @@r$   test_sum_nan_valuesz+BaseSolverTest.PuLPTest.test_sum_nan_values  (    A3Ai7r)   c                 r    dd l }|j                  t        d      | j                  t        fd       y )Nr   rJ   c                       z  S rx   ry   r  s   r$   rp  zBBaseSolverTest.PuLPTest.test_multiply_nan_values.<locals>.<lambda>  r  r)   r  r  s     @@r$   test_multiply_nan_valuesz0BaseSolverTest.PuLPTest.test_multiply_nan_values  r  r)   c                    t        d      }t        d      }||z   dz   }| j                  |t               | j                  |j                  d       |dk  }| j                  |t
               | j                  |j                  d       | j                  |j                  j                  d       |j                         }| j                  |t
               | j                  |j                  d       | j                  |j                  j                  d       | j                  t        |      t        |             | j                  t        |      t        |             y)z-
            LpConstraint.copy()
            rJ   rL   rN   rP   N)
r   r  r   r#  r   r   exprrK  rQ   repr)r:   rJ   rL   r  r   rS   s         r$   test_constraint_copyz,BaseSolverTest.PuLPTest.test_constraint_copy  s    3A3A'(1uqyD!!$(:;T]]A."aiA!!!\2QZZ,QVV__a0 vvxB!!"l3R[["-RWW--q1SVSW-T!Wd2h/r)   c                    t        d      }t        d      }||z   dz   }| j                  |t               | j                  |j                  d       ||z   dk  }| j                  |t
               | j                  |j                  d       | j                  |j                  j                  d       | j                  t        |      d       | j                  t        |      d       |d	z   }| j                  |t
               | j                  |j                  d
       | j                  t        |      d       | j                  t        |      d       ||z   }| j                  |t
               | j                  t        |      t        d	|z  |z   dk               | j                  t        |      t        d	|z  |z   dk               |dz   }| j                  |t               | j                  |j                  d       | j                  t        |      d       ||z   }| j                  |t
               | j                  |j                  j                  d       | j                  |j                  d       | j                  t        |      t        d	|z  |z   dk               | j                  t        |      t        d	|z  |z   dk               |dk  }| j                  |t
               ||z   }	| j                  t        |	      t        d	|z  |z   dk               | j                  t        |	      t        d	|z  |z   dk               |dz   d	k  }| j                  |t
               | j                  |j                  d       | j                  |j                  j                  d       ||z   }	| j                  t        |	      t        d	|z  |z   dk               | j                  t        |	      t        d	|z  |z   dk               y)z:
            __add__ operator on LpConstraint
            rJ   rL   rN   rP   r   r   z
x + y <= 5z1*x + 1*y + -5 <= 0r   r  z
x + y <= 3z1*x + 1*y + -3 <= 0zx + 1r  rK   r]   rM   N)	r   r  r   r#  r   r   r  rQ   r  )
r:   rJ   rL   r  rR   c1_intc1_variablec1_expr
constraintc1_constraints
             r$   test_constraint_addz+BaseSolverTest.PuLPTest.test_constraint_add  s\    3A3A'(1uqyD!!$(:;T]]A. 1uzB!!"l3R[["-RWW--q1SWl3T"X'<=#%6F!!&,7V__b1S[,7T&\+@A(*QK!!+|<S-s1q519>/BCT+.QUQY!^0DE'(1uD!!$(:;T]]A.SY0$&IG!!'<8W\\22A6W--r2S\3q1uqyA~+>?T']DQa,@A'(AvJ!!*l;*,z/MS/QUQY!^1DET-0$q1uqyA~2FG'(1uzJ!!*l;Z00"5Z__55q9*,z/MS/QUQY!^1DET-0$q1uqyA~2FGr)   c                    t        d      }t        d      }||z   dk  }| j                  |t               | j                  |j                  d       | }| j                  |t               | j                  |j                  d       | j                  t        |      t        | | z   dk               | j                  t        |      t        | | z   dk               y)z:
            __neg__ operator on LpConstraint
            rJ   rL   rP   r   N)r   r  r   r#  r   rQ   r  )r:   rJ   rL   rR   c1_negs        r$   test_constraint_negz+BaseSolverTest.PuLPTest.test_constraint_negB  s     3A3A 1uzB!!"l3R[["-$&3F!!&,7V__a0S[#qbA2gm*<=T&\4aR2+>?r)   c                 ^   t        d      }t        d      }d|z  }| j                  |t               | j                  |j	                                ||z   dk  }| j                  |t
               | j                  |j                  d       |dz
  }| j                  |t
               | j                  |j                  d       ||z
  }| j                  |t
               | j                  t        |      d       | j                  t        |      d	       |d
z   }| j                  |t               ||z
  }| j                  |t
               | j                  t        |      d       | j                  t        |      d       |d
k  }	| j                  |	t
               ||	z
  }
| j                  t        |
      d       | j                  t        |
      d       |d
z   dk  }	| j                  |	t
               ||	z
  }
| j                  t        |
      d       | j                  t        |
      d       y)z:
            __sub__ operator on LpConstraint
            rJ   rL   r   rP   r   r   iz0*x + y <= 5z0*x + 1*y + -5 <= 0rN   z0*x + y <= 6z0*x + 1*y + -6 <= 0z0*x + y <= 4z0*x + 1*y + -4 <= 0N)
r   r  r   r  isNumericalConstantr   r#  r   rQ   r  )r:   rJ   rL   expr0rR   r  r  r  r   r!  r"  s              r$   test_constraint_subz+BaseSolverTest.PuLPTest.test_constraint_subS  s    3A3A()AE!!%);<OOE5578 1uzB!!"l3R[["-#%6F!!&,7V__b1(*QK!!+|<S-~>T+.0EF'(1uD!!$(:;$&IG!!'<8S\>:T'],AB'(AvJ!!*l;*,z/MS/@T-02GH'(1uzJ!!*l;*,z/MS/@T-02GHr)   c                 \   t        d      }t        d      }||z   dk  }| j                  |t               | j                  |j                  d       |dk  }| j                  |t               | j                  |j                  d       |dz  }| j                  |t               | j                  |j                  d       | j                  t        |      d       | j                  t        |      d       |t        d      z  }| j                  |t               | j                  |j                  d       | j                  t        |      d       | j                  t        |      d       | j                  t              5  ||z   d	d	d	       | j                  t              5  ||z   d	d	d	       | j                  t              5  ||d
z   z   d	d	d	       | j                  t              5  ||d
z   z   d	d	d	       y	# 1 sw Y   yxY w# 1 sw Y   bxY w# 1 sw Y   HxY w# 1 sw Y   y	xY w)z:
            __mul__ operator on LpConstraint
            rJ   rL   rP   r   r   r  z2*x + 2*y <= 10z2*x + 2*y + -10 <= 0NrN   
r   r  r   r#  r   rQ   r  r   r   r   r:   rJ   rL   rR   rS   r  c1_const_exprs          r$   test_constraint_mulz+BaseSolverTest.PuLPTest.test_constraint_mul~  s    3A3A 1uzB!!"l3R[["- AvB!!"l3R[["-#%6F!!&,7V__c2S[*;<T&\+AB*,/A!/D*DM!!->]33S9S[*;<T&\+AB""9- Q ""9- Q ""9- a!e ""9- a!e     0    G>#H
	H,	H">H
HH"H+c                 \   t        d      }t        d      }||z   dk  }| j                  |t               | j                  |j                  d       |dk  }| j                  |t               | j                  |j                  d       |dz  }| j                  |t               | j                  |j                  d       | j                  t        |      d       | j                  t        |      d       |t        d	      z  }| j                  |t               | j                  |j                  d       | j                  t        |      d       | j                  t        |      d       | j                  t              5  ||z   d
d
d
       | j                  t              5  ||z   d
d
d
       | j                  t              5  ||dz   z   d
d
d
       | j                  t              5  ||dz   z   d
d
d
       y
# 1 sw Y   yxY w# 1 sw Y   bxY w# 1 sw Y   HxY w# 1 sw Y   y
xY w)z:
            __div__ operator on LpConstraint
            rJ   rL   rP   r   r   g      z0.5*x + 0.5*y <= 2.5z0.5*x + 0.5*y + -2.5 <= 0r   NrN   r,  r-  s          r$   test_constraint_divz+BaseSolverTest.PuLPTest.test_constraint_div  s    3A3A 1uzB!!"l3R[["- AvB!!"l3R[["-#%8F!!&,7V__d3S[*@AT&\+FG*,/A!/D*DM!!->]33T:S/1GHT-02MN""9- Q ""9- Q ""9- a!e ""9- a!e     r0  c                    d}g d}t        |      dz
  }g }t        d|dz         D ]$  }t        d| dd      }|j                  |       & |g}t        d|dz         D ]$  }t        d| dd      }|j                  |       & t        d|dz         D ];  }||   }||dz
     ||dz
     z   ||dz
     z
  }	||	k(  }
| j	                  |t               | j                  t        |      d|        | j	                  |	t               | j	                  |
t               |dk(  r[| j                  t        |	      d| d	||dz
     ||dz
     z
          | j                  |
j                  |	j                   |z          | j                  t        |	      d|dz
   d
| d||dz
             | j                  |
j                  |	j                          > y )Nr   )rP   rK   r   rY   rK   r   rN   rN   x_Integerr   )rv   ru   s_z + z + x_z - )
lenr   r   appendr  r#  rQ   r   r   r   )r:   initial_stockdemandsmax_periodssupplyro  variablestocklhsrhsr  s              r$   test_regression_794z+BaseSolverTest.PuLPTest.test_regression_794  s    M,Gg,*K (*F1kAo. (%1#hIJh'( .;OE1kAo. '%1#hIJX&'
 1kAo. CAhAElVAE]2WQU^Ccz%%c:6  SRs84%%c+=>%%dL9 6$$SXA3c%!*wqQRs|:S9T/UV$$T]]S\\MC4GH$$SXAaC5aSGAaCL>/RS$$T]]S\\MB#Cr)   c                    t        d      }| j                  |j                         t        |d      }| j	                  |j                  d       | j                  |j
                  j                         t        dd      }| j	                  |j                  d       t        |d      }| j	                  |j                  d       | j	                  |j
                  j                  d       y )NrN   Test2r  Test1)r   assertIsNoner   r   r#  r  )r:   er   s      r$   test_regression_805z+BaseSolverTest.PuLPTest.test_regression_805  s     #1%Aaff%QW-AQVVW-affkk*"173AQVVW-QW-AQVVW-QVV[['2r)   )S__name__
__module____qualname__r7   r;   rH   rT   rl   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r(  r4  r8  r<  r?  rG  rI  rP  rU  rb  rg  rr  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r(   r  r  r  r  r  r  r
  r  r  r  r#  r&  r*  r/  r2  rA  rG  ry   r)   r$   PuLPTestr3   `   s   		M
	
	#	J		7		7
		"	LH*	X0	d	 	F	F	(			"	6	P 	8	F	M"	M0	M,	(	*#	J	0	0	,	$	$	$4	Ll	0	)	$	"	0	4*	$	"%	N	,	S	NB
	;	/	1&	1&	1"	1$	H	6	4
	*		+	+6	? 
$	1 
$	1L 
	O 
	O	.	9B	9,7	Kr	<	8	8	0.5	Hn	@")	IV%	N%	N$	CL	3r)   rK  N)rH  rI  rJ  r   TestCaserK  ry   r)   r$   r1   r1   _   s    a38$$ a3r)   r1   c                   L    e Zd ZeZed        Ze	 dd       Zd Zd Z	d Z
d Zy)	PULP_CBC_CMDTestc                     t        |       5 }|j                         D ]   }|j                  d      s|c cddd       S  	 ddd       t        d|        # 1 sw Y   xY w)z?
        Read from log file the command line executed.
        zcommand line Nz#Unable to find the command line in )open	readlines
startswith
ValueError)r^  fprows      r$   read_command_line_from_log_filez0PULP_CBC_CMDTest.read_command_line_from_log_file  sg    
 '] 	b||~ >>/2J	 		 >wiHII		 	s   %AAAA c                     t        j                  | | d| d      }|j                  |       }|st        | d|         y|j	                         d   }|S )a  
        Extract option value from command line string.

        :param command_line: str that we extract the option value from
        :param option: str representing the option name (e.g., presolve, sec, etc)
        :param prefix: str (default: '-')
        :param grp_pattern: str (default: '[a-zA-Z]+') - regex to capture option value

        :return: option value captured (str); otherwise, None

        example:

        >>> cmd = "cbc model.mps -presolve off -timeMode elapsed -branch"
        >>> PULP_CBC_CMDTest.extract_option_from_command_line(cmd, "presolve")
        'off'

        >>> cmd = "cbc model.mps -strong 101 -timeMode elapsed -branch"
        >>> PULP_CBC_CMDTest.extract_option_from_command_line(cmd, "strong", grp_pattern="\d+")
        '101'
        z\s+(z)\s*z not found in Nr   )recompilesearchprintgroups)command_lineoptionprefixgrp_patternpatternmoption_values          r$    extract_option_from_command_linez1PULP_CBC_CMDTest.extract_option_from_command_line  s_    0 **[MFGNN<(VHN<.9:xxz!}r)   c                 b   | j                   }t        |t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|dz   }|| j
                  j                  d<   d| j
                  j                  d<   t        || j
                  t        j                  g|d|d|d|di       t        j                  j                  |      st        d| j
                         t        j                  j                  |      st        d| j
                         t        j                  |      }t        j!                  |d      }	| j#                  d|	       y)zo
        Test if setting presolve=False in PULP_CBC_CMD adds presolve off to the
        command line.
        rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   rW  r^  Fpresolver]   rt  r^  offNrC   r   r`   ra   r   r   r   re   ro   rD   ru  rv  r   rw  rN  rV  rd  r#  
r:   r   r.   rJ   rL   rO   rV   ra  r]  rc  s
             r$   test_presolve_offz"PULP_CBC_CMDTest.test_presolve_off2  s   
 ##u//0sAq!sB"sAsAAE	AE!5((A
D  AT!!Q!T!!QVm-8	*.3
+KK""#1b!Q1%		
 ww~~k*6t{{mDEEww{+6t{{mDEE'GGT'HH I 
 	-r)   c                    | j                   }t        |t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|dz   }|| j
                  j                  d<   d| j
                  j                  d<   t        || j
                  t        j                  g|d|d|d|di       t        j                  j                  |      st        d| j
                         t        j                  j                  |      st        d| j
                         t        j                  |      }t        j!                  |d      }	t        j!                  |dd      }
t        j!                  |dd      }| j#                  g d|	|
|g       y) z
        Test if setting cuts=True in PULP_CBC_CMD adds "gomory on knapsack on
        probing on" to the command line.
        rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   rW  r^  Tcutsr]   rt  gomoryrg  knapsackr  )r^  r_  probing)onrq  rq  N)rC   r   r`   ra   r   r   r   re   ro   rD   ru  rv  r   rw  rN  rV  rd  assertListEqual)r:   r   r.   rJ   rL   rO   rV   ra  r]  gomory_valueknapsack_valueprobing_values               r$   test_cuts_onzPULP_CBC_CMDTest.test_cuts_onV  s   
 ##u//0sAq!sB"sAsAAE	AE!5((A
D  AT!!Q!T!!QVm-8	**.'KK""#1b!Q1%		
 ww~~k*6t{{mDEEww{+6t{{mDEE'GGT'HH I 
 *JJB K 
 )II2 J 
 	~} M	
r)   c                 b   | j                   }t        |t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|dz   }|| j
                  j                  d<   d| j
                  j                  d<   t        || j
                  t        j                  g|d|d|d|di       t        j                  j                  |      st        d| j
                         t        j                  j                  |      st        d| j
                         t        j                  |      }t        j!                  |d      }	| j#                  d|	       y)zO
        Test if setting cuts=False adds cuts off to the command line.
        rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   rW  r^  Frm  r]   rt  rg  rh  Nri  rj  s
             r$   test_cuts_offzPULP_CBC_CMDTest.test_cuts_off  s    ##u//0sAq!sB"sAsAAE	AE!5((A
D  AT!!Q!T!!QVm-8	**/'KK""#1b!Q1%		
 ww~~k*6t{{mDEEww{+6t{{mDEE'GGT'HH I 
 	-r)   c                 d   | j                   }t        |t        j                        }t	        ddd      }t	        ddd      }t	        dd      }t	        dd      }||d|z  z   d	|z  z   d
fz  }|||z   dk  dfz  }|||z   dk\  dfz  }|| |z   dk(  dfz  }||dk\  dfz  }|dz   }|| j
                  j                  d<   d| j
                  j                  d<   t        || j
                  t        j                  g|d|d|d|di       t        j                  j                  |      st        d| j
                         t        j                  j                  |      st        d| j
                         t        j                  |      }t        j!                  |dd      }	| j#                  d|	       y)zO
        Test if setting strong=10 adds strong 10 to the command line.
        rJ   r   rK   rL   rM   rN   rO   rV   rW   rX   rP   rR   rY   rS   rZ   r[   r\   rW  r^  strongr]   rt  z\d+)r^  r`  10Nri  rj  s
             r$   test_strongzPULP_CBC_CMDTest.test_strong  s    ##u//0sAq!sB"sAsAAE	AE!5((A
D  AT!!Q!T!!QVm-8	*,.)KK""#1b!Q1%		
 ww~~k*6t{{mDEEww{+6t{{mDEE'GGT'HHv I 
 	|,r)   N)-z	[a-zA-Z]+)rH  rI  rJ  rc   r7   staticmethodrV  rd  rk  rv  rx  r|  ry   r)   r$   rN  rN    sI    IJ J 6A >".H*
X!.F!-r)   rN  c                       e Zd ZeZy)CPLEX_CMDTestNrH  rI  rJ  r   r7   ry   r)   r$   r  r        Ir)   r  c                       e Zd ZeZy)CPLEX_PYTestNr  ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)XPRESS_CMDTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r        Ir)   r  c                       e Zd ZeZy)XPRESS_PyTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)COIN_CMDTestN)rH  rI  rJ  rd   r7   ry   r)   r$   r  r        Ir)   r  c                       e Zd ZeZy)COINMP_DLLTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)GLPK_CMDTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)
GUROBITestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r        Ir)   r  c                       e Zd ZeZy)GUROBI_CMDTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)
PYGLPKTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)YAPOSIBTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r        Ir)   r  c                       e Zd ZeZy)CHOCO_CMDTestN)rH  rI  rJ  rg   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)MIPCL_CMDTestN)rH  rI  rJ  rh   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)	MOSEKTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r        Ir)   r  c                       e Zd ZeZy)SCIP_CMDTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)FSCIP_CMDTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)SCIP_PYTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r  	  r  r)   r  c                       e Zd ZeZy)HiGHS_PYTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)HiGHS_CMDTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r    r  r)   r  c                       e Zd ZeZy)COPTTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r    s    Ir)   r  c                       e Zd Zd Zy)SASTestc                    t        dt              }t        j                  dg ddd      }|d|d   z  d	|d   z  z
  d
|d	   z  z
  dfz  }|d|d   z  d	|d	   z  z
  dk\  dfz  }||d   |d   z   d|d	   z  z   d
k  dfz  }||d   d|d   z  z   d	|d	   z  z   dk  dfz  }d| j                  j
                  d<   t        || j                  t        j                  g|d   d|d   d|d	   di       y )Nri  rJ   r  g        r5  rt   r   rN   rs   rK   rX   r   r   R1R2rZ   R3r?   withg      @)	r   ra   r   r  r   r   re   r`   ro   )r:   r.   r  s      r$   test_sas_with_optionzSASTest.test_sas_with_option  s*   ,S)cyIAaD1qt8#a!A$h.55QqT	A!H$*D00!qta!A$h&!+T11!q1Q4x!ad(*a/55*.'KK""#qT3!c1Q4-		
r)   N)rH  rI  rJ  r  ry   r)   r$   r  r    s    
r)   r  c                       e Zd ZeZy)	SAS94TestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r  +  r  r)   r  c                       e Zd ZeZy)
SASCASTestN)rH  rI  rJ  r   r7   ry   r)   r$   r  r  /  r  r)   r  c
                     | | j                   |fi |
}||vrYt        |        t        dj                  |||t        j
                  |   |D cg c]  }t        j
                  |    c}            |e|j                         D ]R  \  }}t        |j                  |z
        |kD  s"t        |        t        dj                  |||j                  |             |re|j                         D ]R  \  }}t        |j                  |z
        |kD  s"t        |        t        dj                  |||j                  |             |rt|j                         D ]a  \  }}| j                  |   }t        |j                  |z
        |kD  s1t        |        t        dj                  |||j                  |             |rt|j                         D ]a  \  }}| j                  |   }t        |j                  |z
        |kD  s1t        |        t        dj                  |||j                  |             |	K| j                  j                         }t        ||	z
        |kD  rt        |        t        d| d| d|	       y y c c}w )	NzITests failed for solver {}:
status == {} not in {}
status == {} not in {}z.Tests failed for solver {}:
var {} == {} != {}z>Tests failed for solver {}:
Test failed: var.dj {} == {} != {}z8Tests failed for solver {}:
constraint.pi {} == {} != {}z;Tests failed for solver {}:
constraint.slack {} == {} != {}zTests failed for solver z:
objective z != )r  r/   r   formatr`   LpStatusr  absr  djr   pislackr   r  )r.   r   okstatusrA   r  r  r  epsr
  r   r!   srk   rJ   r  cnamepr   r  rO   s                       r$   re   re   7  s    ~F-f-XY``v&,45q"5
 	
 IIK 	DAq1::>"S(%ELL1::q 	 !'') 	EAr144"9~#%U\\144 	  	HE1  'A144!8}s"%OVVqttQ 		 "LLN 	LE5  'A177U?#c)%RYYqww 		 NN  "q9}#D!*6(-s$ykR  $ S 6s   I;c                     | j                         }|d   j                  fd       |d   j                  fd       |S )Nr   c                     |    S rx   ry   )rk   r  s    r$   rp  zgetSortedDict.<locals>.<lambda>  s    AgJ r)   )keyr  c                     |    S rx   ry   )rk   keyVarss    r$   rp  zgetSortedDict.<locals>.<lambda>  s    !G* r)   )r/  sort)r.   r  r  _dicts    `` r$   r  r    sA    KKME	-"67	+ 45Lr)   __main__)NNNNgMbP?NN)r   r   )?__doc__r&   rD   rX  r  r   r7  r   r   r   r   r   r   r	   r
   r`   r   	pulp.apispulp.constantsr   pulp.tests.bin_packing_problemr   pulp.utilitiesr   gurobipyr   ImportErrorr  replacer  r  r(   r/   r1   rK  rN  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  re   r  rH  mainry   r)   r$   <module>r     s    	 	     $   $ E #
 . *11)+P  *11)+P 
,b3 b3J5B-~.. B-JN++ >** ^,, N++ >** ^,, >** (( ^,, (( .)) N++ N++ '' >** N++ .)) >** N++ ~&& 
 
$'' (('  	
FR zHMMO UC  	Bs   J J('J(