o
    g*6                  	   @   sJ  d Z ddlZddlZddlmZmZ ddlZddlm	Z	 ddl
mZmZmZ dd Zejjd	d
ddd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zejjejddd Zdd  Zd!Zd"Zejje dj!d#k d$d%ejjejd&ej"d'd(gd)d*iefd+diefgd,d- Z#d.d/ Z$ejj%d0d1 Z&dS )2z0
Unit test for Mixed Integer Linear Programming
    N)assert_allcloseassert_array_equal   )magic_square)milpBoundsLinearConstraintc                  C   s  d} t jt| d ttd W d    n1 sw   Y  t jt| d tg  W d    n1 s6w   Y  t jt| d td  W d    n1 sQw   Y  d} t jt| d tddd W d    n1 spw   Y  d} t jtt| d tddd	 W d    n1 sw   Y  t jtt| d ttd
g dgdd
gdd
gfd	 W d    n1 sw   Y  d} t jtt| d ttd
ddggdgdgfd	 W d    n1 sw   Y  d} t jt| d tg dddgd W d    n	1 sw   Y  t jt| d tg dg dd W d    n	1 s2w   Y  d} t jt| d tg dddgg dfd W d    n	1 sZw   Y  t jt| d tg dg dddgfd W d    n	1 sw   Y  d} t jt| d tg dddgd
dgfd W d    n	1 sw   Y  t jt| d tg dg dg dfd W d    n	1 sw   Y  t jt| d tg dg dt ddgfd W d    d S 1 sw   Y  d S )Nz:`c` must be a one-dimensional array of finite numbers withmatch)      z3`bounds` must be convertible into an instance of...r   
   boundsz<`constraints` (or each element within `constraints`) must be)constraintsr   )r      r   r   z,The shape of `A` must be (len(b_l), len(c)).zJ`integrality` must contain integers 0-3 and be broadcastable to `c.shape`.)integrality)r      r   z6`lb`, `ub`, and `keep_feasible` must be broadcastable.)r   r   r   r   r   z5`bounds.lb` and `bounds.ub` must contain reals and...)z3+4r   r   )	pytestraises
ValueErrorr   npzerosreescapeset)message r   \/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/scipy/optimize/tests/test_milp.pytest_milp_iv   sb   

($"$r   Fz%Needs to be fixed in `_highs_wrapper`)runreasonc           
      C   s   d}ddi}t jt|d td|d W d    n1 sw   Y  td\}}}}}ddd	d
}t||||fdd|d}|  }	d|	jv sIJ d|	jv sPJ |jrUJ d S )Nz*Unrecognized options detected: {'ekki'}...ekkiTr	   r   )optionsr   F皙?)disppresolve
time_limitr   r   cr   r   r   r#   zPresolve is switched offzTime Limit Reached)r   warnsRuntimeWarningr   r   
readouterroutsuccess)
capsysr   r#   Abr*   numbersMrescapturedr   r   r   test_milp_options<   s   r7   c                  C   sJ  t d\} }}}}t|| ||fddd}|jdksJ |js J d}|j|s*J t|jtj	s3J t|j
ts;J t|jtsCJ t|jtsKJ t|jtsSJ t d\} }}}}t|d | ||fdddd	id
}|jdkssJ |jrxJ d}|j|sJ |j
|j  u r|j  u r|j  u r|j  u rd u sJ  J tddd}|jdksJ |jrJ d}|j|sJ |j
|j  u r|j  u r|j  u r|j  u rd u sJ  J td}|jdksJ |jrJ d}|j|sJ |j
|j  u r |j  u r |j  u r |j  u r d u s#J  J d S )Nr   r(   r   r*   r   r   r   r   z6Optimization terminated successfully. (HiGHS Status 7:   r'   r$   r)   %Time limit reached. (HiGHS Status 13:)r   r   r   z+The problem is infeasible. (HiGHS Status 8:r;   z+The problem is unbounded. (HiGHS Status 10:)r   r   statusr/   r   
startswith
isinstancexr   ndarrayfunfloatmip_node_countintmip_dual_boundmip_gap)r1   r2   r*   r3   r4   r5   msgr   r   r   test_resultP   sd   



 

rH   c                  C   s(   t d} | jdksJ t| jdg d S )Nr   r   )r   rA   r   r?   )r5   r   r   r   test_milp_optional_argsx   s   rI   c            
   	   C   s   d} t | \}}}}}t|d |||fddd}t|j}| | | d | | }tj|dd}	tj	|	jdd| tj	|	jdd| tj	t
|	 | tj	t
|	d d d d df  | d S )	Nr   r   r(   r   r8   r   )axisr;   )r   r   r   roundr?   flattenreshapesumtestingr   diag)
nr1   r2   r*   r3   r4   r5   r?   ssquarer   r   r   test_milp_1   s   .rT   c               
   C   s&  t d } ddgddgg}dt j g}t jdg}t|||}t| |||fdd}t| |dd}t| |||fgdd}t| |gdd}t| d|d d |d d |d d f|dd  |dd  |dd  fgd	}	t| dt|d d |d d |d d t|dd  |dd  |dd  gd	}
t| d|d d |d d |d d ft|dd  |dd  |dd  gd	}t |j|j|j|j|	j|
j|jg}t |j|j|j|j|	j|
j|jg}t j	|t 
ddg|j t j	|d
 t| |||fd}t j	|jddg t j	|jd d S )Nr   ir   r      Tr*   r   r   )r*   r   r   r*   r   r   g      @g      !)r   onesinfr   r   arrayr?   rA   rO   r   broadcast_toshape)r*   r1   b_lb_ulinear_constraintres1res2res3res4res5res6res7xsfunsr5   r   r   r   test_milp_2   sB   
  "" "&rk   c                  C   s   ddg} ddgddgddgg}g d}t j|t j t jd}t|||}t | }t| ||d}t|jd	 t 	|j
ddgsJt 	|j
ddgsJJ t| |d
}t|jd t|j
ddg d S )Nr   r;   r   r   r   )r      rl   )dtyperW   rU   rY   gffffffg?gffffff@)r   	full_liker[   float64r   	ones_liker   r   rA   allcloser?   )r*   r1   r`   r_   r   r   r5   r   r   r   test_milp_3   s   
(rr   c                  C   s   ddg} ddg}ddgddgddgg}dt j t j g}t jdd	g}t|||}tt j t j}t| |||d
}t|jd t|jddg d S )N   r   r   r   r;   ii   r   r   r   ;   g      @   )r   r[   r   r   r   r   rA   r?   )r*   r   r1   r_   r`   r   r   r5   r   r   r   test_milp_4   s   ry   c            
      C   s   g d} g d}g d}t jt jdg}t||}g dg dg}t j dg}ddg}t|||}t| |||d	}	t|	jd
 d S )N)rX   rU   r;   )r   r   r   )r   r   r   r   )r   r   r   )r   r   r   rl   rx   rv   i)r   r[   r   r   r   r   rA   )
r*   r   lbubr   r1   r_   r`   r   r5   r   r   r   test_milp_5   s   
r|   x   c                  C   sj   d} t g dg dg dg dg}t g d}t g d}t||||f| d}t j|jd	 d S )
Nr      rV      !      r      r   '      r      r               r         r   &   r   r   )   r   r   $   r   r   r   r   i  i(  i:,  i/  r   r   rV      rx   r   rx   r   rW   i>  )r   r\   r   rO   r   rA   )r   A_eqb_eqr*   r5   r   r   r   test_milp_6   s   
r   c            	      C   sr   ddg} ddg}dt j g}t jt jg}t||}ddgg}dg}t|||}t| |||d}t j|jd d S )Ng      ?g        r   r   g      ?rv   r   )r   r[   r   r   r   rO   assert_equalr<   )	r*   r   rz   r{   r   r   r   r   r5   r   r   r   test_infeasible_prob_16609  s   

r   r:   z*Iteration limit reached. (HiGHS Status 14:rs   zUnhandled 32-bit GCC FP bug)r!   ih  r#   rG   r'   r   
node_limitc                 C   s,  t jd}|jdddd}t jdt j d}t jddd}t|||}t d}t d}t	||}	t d}
t d }t
||
|	|| d	}|j|sOJ |d
 d usWJ |d
 }d}t || || krst || || ksuJ t || |krt ||| ksJ t |t |sJ d S )N   $s8 r   r   )d   r   sizer   
fill_value   )r   r   r   r#   r?   g:0yE>)r   randomdefault_rngintegersfullr[   r   r   rZ   r   r   r   r=   allrq   rK   )r#   rG   rngr1   b_lbb_ubr   variable_lbvariable_ubvariable_boundsr   c_vectorr5   r?   tolr   r   r   test_milp_timeout_16545  s0   	



0(r   c                  C   s  t jd} | jdddd}t jdt j d}t jddd}t|d d	 |d d	 |d d	 t|d	d
 |d	d
 |d	d
 t|d
d  |d
d  |d
d  g}|d d	 |d d	 |d d	 f|d	d
 |d	d
 |d	d
 f|d
d  |d
d  |d
d  fg}t d}t d}t	||}t d }	t
|	||d}
t
|	||d}t
|	||||fd}|
jr|jsJ t|
j|j t|j|j d S )Nr   r   r   )r9   r9   r   r9   r   r   r   r   )r   r   )r   r   r   r   r   r[   r   r   rZ   r   r   r/   r   r?   )r   r1   blbur   constraints2rz   r{   r   r*   rb   rc   refr   r   r   test_three_constraints_16878>  s,   """   


r   c                  C   s   t g dg dg dg dg} t g d}t g d}g d}g }|D ].}t|dt jf| ||fd	d
|id}|j|ksAJ |j|j|j |j ksOJ ||j q't t 	|dk sbJ d S )Nr~   r   r   r   r   r   )g      ?g{Gz?gMbP?r   Tmip_rel_gap)r*   r   r   r   r#   )
r   r\   r   r[   rF   rA   rE   appendr   diff)r   r   r*   mip_rel_gapssol_mip_gapsr   r5   r   r   r   test_mip_rel_gap_passdownW  s"   
r   )'__doc__r   numpyr   numpy.testingr   r   r   test_linprogr   scipy.optimizer   r   r   r   markxfailr7   rH   rI   rT   rk   rr   ry   r|   slowtimeoutr   r   	_msg_time	_msg_iterskipifintpitemsizeparametrizer   r   xslowr   r   r   r   r   <module>   sJ    .
(%


 