U
    »mœd*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 5 Q R X t jt| d�� tg ƒ W 5 Q R X t jt| d�� td ƒ W 5 Q R X d} t jt| d�� tddd� W 5 Q R X d} t jtt | ¡d�� tddd	� W 5 Q R X t jtt | ¡d��. tt d
¡ddd
ggdd
gdd
gfd	� W 5 Q R X d} t jtt | ¡d��( tt d
¡ddggdgdgfd	� W 5 Q R X d} t jt| d�� tddd
gddgd� W 5 Q R X t jt| d�� tddd
gddd
gd� W 5 Q R X d} t jt| d��& tddd
gddgd
ddgfd� W 5 Q R X t jt| d��& tddd
gddd
gddgfd� W 5 Q R X d} t jt| d��$ tddd
gddgd
dgfd� W 5 Q R X t jt| d��( tddd
gddd
gdddgfd� W 5 Q R X t jt| d��* tddd
gddd
gtƒ ddgfd� W 5 Q R X 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   é   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é   z6`lb`, `ub`, and `keep_feasible` must be broadcastable.r   z5`bounds.lb` and `bounds.ub` must contain reals and...z3+4)	ÚpytestZraisesÚ
ValueErrorr   ÚnpÚzerosÚreÚescapeÚset)Úmessage© r   úW/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/optimize/tests/test_milp.pyÚtest_milp_iv   sF    2, "**(,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 5 Q R X tdƒ\}}}}}ddd	d
œ}t||||fdd|d�}|  ¡ }	d|	jks~t‚d|	jksŒt‚|jr–t‚d S )Nz*Unrecognized options detected: {'ekki'}...ZekkiTr	   r   )Úoptionsr   Fçš™™™™™©?)ZdispZpresolveÚ
time_limit©r   r   ©Úcr   r   r   r!   zPresolve is switched offzTime Limit Reached)	r   ZwarnsÚRuntimeWarningr   r   Z
readouterrÚoutÚAssertionErrorÚsuccess)
Zcapsysr   r!   ÚAÚbr&   ÚnumbersÚMÚresZcapturedr   r   r   Útest_milp_options<   s    ÿr0   c                  C   sf  t dƒ\} }}}}t|| ||fddd�}|jdks6t‚|js@t‚d}|j |¡sTt‚t|jt	j
ƒsft‚t|jtƒsvt‚t|jtƒs†t‚t|jtƒs–t‚t|jtƒs¦t‚t dƒ\} }}}}t|d | ||fdddd	id
�}|jdksæt‚|jrðt‚d}|j |¡�st‚|j|j  k�rL|j  k�rL|j  k�rL|j  k�rLd k�sRn t‚tddd�}|jdk�snt‚|j�rzt‚d}|j |¡�s�t‚|j|j  k�rÖ|j  k�rÖ|j  k�rÖ|j  k�rÖd k�sÜn t‚tdƒ}|jdk�sôt‚|j�r t‚d}|j |¡�st‚|j|j  k�r\|j  k�r\|j  k�r\|j  k�r\d k�sbn t‚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:r4   z+The problem is unbounded. (HiGHS Status 10:)r   r   Ústatusr)   r*   r   Ú
startswithÚ
isinstanceÚxr   ZndarrayÚfunÚfloatZmip_node_countÚintÚmip_dual_boundÚmip_gap)r+   r,   r&   r-   r.   r/   Úmsgr   r   r   Útest_resultP   sd    
ÿ
 ÿ
ÿ
ÿ ÿ
ÿ
ÿ ÿ
ÿ
ÿr?   c                  C   s(   t dƒ} | jdkst‚t| jdgƒ d S )Nr   r   )r   r9   r)   r   r8   )r/   r   r   r   Útest_milp_optional_argsx   s    r@   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   r1   r   )Zaxisr4   )r   r   r   Úroundr8   ÚflattenZreshapeÚsumÚtestingr   Zdiag)
Únr+   r,   r&   r-   r.   r/   r8   ÚsZsquarer   r   r   Útest_milp_1   s    rG   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   éþÿÿÿiøÿÿÿr   r   é   T©r&   r   r   )r&   r   r   éýÿÿÿ©r&   r   r   g      @g      !À)r   ÚonesÚinfr   r   Úarrayr8   r9   rD   r   Zbroadcast_toÚshape)r&   r+   Úb_lÚb_uZlinear_constraintÚres1Úres2Zres3Zres4Zres5Zres6Zres7ZxsZfunsr/   r   r   r   Útest_milp_2�   sH    
  ÿÿ""ÿÿ "ÿÿ&   ÿrU   c                  C   sÂ   ddg} ddgddgddgg}dddg}t j|t j t jd�}t|||ƒ}t  | ¡}t| ||d�}t|jd	ƒ t  	|j
ddg¡s–t  	|j
ddg¡s–t‚t| |d
�}t|jdƒ t|j
ddgƒ d S )Nr   r4   r   r   r   é   )ZdtyperJ   rH   rL   gffffffÀgÍÌÌÌÌÌü?gffffff@)r   Z	full_likerN   Zfloat64r   Z	ones_liker   r   r9   Úallcloser8   r)   )r&   r+   rR   rQ   r   r   r/   r   r   r   Útest_milp_3´   s    

(rX   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   éüÿÿÿr4   iòÿÿÿißÿÿÿé   ©r   r   r   é;   g      @é   )r   rN   r   r   r   r   r9   r8   )r&   r   r+   rQ   rR   r   r   r/   r   r   r   Útest_milp_4Ë   s    ÿr_   c            
      C   sŠ   dddg} dddg}dddg}t jt jdg}t||ƒ}dddgdddgg}t j dg}d	dg}t|||ƒ}t| |||d
�}	t|	jdƒ d S )NrK   rH   r4   r   r   r   r   rV   r^   r\   iôÿÿÿ)r   rN   r   r   r   r   r9   )
r&   r   ÚlbÚubr   r+   rQ   rR   r   r/   r   r   r   Útest_milp_5Ü   s    



ÿrb   éx   c                  C   sª   d} t  ddddddddgd	d
ddddddgddddddddgddddddd
dgg¡}t  ddddg¡}t  ddddddddg¡}t||||f| d�}t j |jd¡ d S ) Nr   é   rI   é   é!   é   r   é   é'   é   é   é   é   é   é   é   é   é&   é)   é$   éÀ  éâ(  é:,  é/  r   r   é   r^   r   rJ   i>  )r   rO   r   rD   r   r9   )r   ÚA_eqÚb_eqr&   r/   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      à?r\   r   )r   rN   r   r   r   rD   Zassert_equalr5   )	r&   r   r`   ra   r   rz   r{   r   r/   r   r   r   Útest_infeasible_prob_16609  s    

ÿr}   r3   z*Iteration limit reached. (HiGHS Status 14:rY   zUnhandled 32-bit GCC FP bug)r    ih  r!   r>   r#   r   Z
node_limitc                 C   s2  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 |¡sžt‚|d
 d k	s®t‚|d
 }d}t  || || k¡ræt  || || k¡sêt‚t  || |k¡�rt  ||| k¡�st‚t  |t  |¡¡�s.t‚d S )Nì   $sƒ¥Ü8 r   r   )éd   r   ©Úsizer   ©Z
fill_valueé   )r   r   r   r!   r8   g:Œ0âŽyE>)r   ÚrandomÚdefault_rngÚintegersÚfullrN   r   r   rM   r   r   r   r6   r)   ÚallrW   rA   )r!   r>   Úrngr+   Zb_lbZb_ubr   Zvariable_lbZvariable_ubÚvariable_boundsr   Zc_vectorr/   r8   Z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�rt|j�sxt‚t|
j|jƒ t|j|jƒ d S )Nr~   r   r   )r2   r2   r€   r2   r‚   r   r   r   )r   r   )r   r„   r…   r†   r‡   rN   r   r   rM   r   r   r*   r)   r   r8   )r‰   r+   ÚblZbur   Zconstraints2r`   ra   rŠ   r&   rS   rT   Úrefr   r   r   Útest_three_constraints_16878>  s,    """þ   þ


rŽ   c                  C   s  t  ddddddddgdd	dd
ddddgddddddddgddd
dddd	dgg¡} t  ddddg¡}t  ddddddddg¡}dddg}g }|D ]\}t|d t jf| ||fd!d"|id#�}|j|ksÄt‚|j|j|j |j ksàt‚| |j¡ q�t  	t  
|¡d k ¡�st‚d S )$Nrd   rI   re   rf   rg   r   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   r   r   ry   r^   r   g      Ð?g{®Gáz„?gü©ñÒMbP?r   TÚmip_rel_gap)r&   r   r   r   r!   )r   rO   r   rN   r=   r)   r9   r<   Úappendrˆ   Údiff)rz   r{   r&   Zmip_rel_gapsZsol_mip_gapsr�   r/   r   r   r   Útest_mip_rel_gap_passdownW  s$    ý
 ÿr’   )'Ú__doc__r   Únumpyr   Znumpy.testingr   r   r   Ztest_linprogr   Zscipy.optimizer   r   r   r   ÚmarkZxfailr0   r?   r@   rG   rU   rX   r_   rb   ZslowÚtimeoutr|   r}   Z	_msg_timeZ	_msg_iterZskipifZintpÚitemsizeZparametrizer‹   rŽ   Zxslowr’   r   r   r   r   Ú<module>   sH   .ÿ
(%
ÿ

ÿ 