o
    5ήc*                     @   s   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dd Zdd Zd d! ZdS )"z0
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   E/tmp/pip-target-vg8gfxp4/lib/python/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)   z%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   



 

rG   c                  C   s(   t d} | jdksJ t| jdg d S )Nr   r   )r   r@   r   r>   )r5   r   r   r   test_milp_optional_argsx   s   rH   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   .rS   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>   r@   rN   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   
  "" "&rj   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      rk   )dtyperV   rT   rX   gffffffg?gffffff@)r   	full_likerZ   float64r   	ones_liker   r   r@   allcloser>   )r*   r1   r_   r^   r   r   r5   r   r   r   test_milp_3   s   
(rq   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   rZ   r   r   r   r   r@   r>   )r*   r   r1   r^   r_   r   r   r5   r   r   r   test_milp_4   s   rx   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)rW   rT   r:   )r   r   r   )r   r   r   r   )r   r   r   )r   r   r   rk   rw   ru   i)r   rZ   r   r   r   r   r@   )
r*   r   lbubr   r1   r^   r_   r   r5   r   r   r   test_milp_5   s   
r{   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   )   rU      !      r      r}   )'      r|      r}            )   r         r   &   r}   r}   ))   r}   r   $   r   r   r   r}   )i  i(  i:,  i/  )r   r   rU      rw   r   rw   r   rV   i>  )r   r[   r   rN   r   r@   )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      ?ru   r   )r   rZ   r   r   r   rN   assert_equalr;   )	r*   r   ry   rz   r   r   r   r   r5   r   r   r   test_infeasible_prob_16609   s   

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 )Nl   $s8 r   r   )r9   r9   )sizer9   )
fill_valuer   r   r   )r   r   )r   randomdefault_rngintegersfullrZ   r   r   rY   r   r   r/   r   r>   )rngr1   blbur   constraints2ry   rz   variable_boundsr*   ra   rb   refr   r   r   test_three_constraints_16878  s,   """   


r   )__doc__r   numpyr   numpy.testingr   r   r   test_linprogr   scipy.optimizer   r   r   r   markxfailr7   rG   rH   rS   rj   rq   rx   r{   slowr   r   r   r   r   r   r   <module>   s.    .
(%
