a
    ‡ù»jZ:  ã                   @   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l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'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ÚLinearConstraint)Úsparsec                  C   sH  d} t jt| d��" tt ddg¡ƒ W d   ƒ n1 s:0    Y  d} t jt| d�� tt d¡ƒ W d   ƒ n1 sz0    Y  t jt| d�� tg ƒ W d   ƒ n1 s°0    Y  t jt| d�� td ƒ W d   ƒ n1 sæ0    Y  d} t jt| d�� tddd	� W d   ƒ n1 �s&0    Y  d
} t jtt 	| ¡d�� tddd� W d   ƒ n1 �sl0    Y  t jtt 	| ¡d��6 tt d¡g d¢gddgddgfd� W d   ƒ n1 �sÈ0    Y  t jtt 	| ¡d��8 tt d¡ddggdgt dg¡fd� W d   ƒ n1 �s&0    Y  d} t jtt 	| ¡d��2 tt d¡ddggdgdgfd� W d   ƒ n1 �s‚0    Y  d} t jt| d��* tddgt ddg¡d� W d   ƒ n1 �sÐ0    Y  d} t jt| d��$ tg d¢ddgd� W d   ƒ n1 �s0    Y  t jt| d��$ tg d¢g d¢d� W d   ƒ n1 �s\0    Y  d} t jt| d��2 tg d¢ddgt ddg¡fd	� W d   ƒ n1 �s²0    Y  d} t jt| d��, tg d¢ddgg d¢fd	� W d   ƒ n1 �s0    Y  t jt| d��, tg d¢g d¢ddgfd	� W d   ƒ n1 �sN0    Y  d} t jt| d��, tg d¢ddgddgfd	� W d   ƒ n1 �sž0    Y  t jt| d��, tg d¢g d¢g d¢fd	� W d   ƒ n1 �sê0    Y  t jt| d��0 tg d¢g d¢t
ƒ ddgfd	� W d   ƒ n1 �s:0    Y  d S )Nz`c` must be a dense array©Úmatchr   z:`c` must be a one-dimensional array of finite numbers with)é   é   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)).z#`integrality` must be a dense array)ÚintegralityzJ`integrality` must contain integers 0-3 and be broadcastable to `c.shape`.)r   é   r   z,Lower and upper bounds must be dense arrays.r   z6`lb`, `ub`, and `keep_feasible` must be broadcastable.)r   r   r   r   z5`bounds.lb` and `bounds.ub` must contain reals and...)z3+4r   r   )ÚpytestZraisesÚ
ValueErrorr   r	   Z	coo_arrayÚnpÚzerosÚreÚescapeÚset)Úmessage© r   úDE:\soccer\ml_env\Lib\site-packages\scipy/optimize/tests/test_milp.pyÚtest_milp_iv   s\    0,&&,,FHB:44B<<<<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<0    Y  tdƒ\}}}}}ddd	d
œ}t||||fdd|d�}|  ¡ }	d|	jv s’J ‚d|	jv s J ‚|jrªJ ‚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Úsuccess)
Zcapsysr   r"   ÚAÚbr'   ÚnumbersÚMÚresZcapturedr   r   r   Útest_milp_optionsK   s    *ÿr0   c                  C   sf  t dƒ\} }}}}t|| ||fddd�}|jdks6J ‚|js@J ‚d}|j |¡sTJ ‚t|jtj	ƒsfJ ‚t|j
tƒsvJ ‚t|jtƒs†J ‚t|jtƒs–J ‚t|jtƒs¦J ‚t dƒ\} }}}}t|d | ||fdddd	id
�}|jdksæJ ‚|jrðJ ‚d}|j |¡�sJ ‚|j
|j  u �rL|j  u �rL|j  u �rL|j  u �rLd u �sRn J ‚tddd�}|jdk�snJ ‚|j�rzJ ‚d}|j |¡�s�J ‚|j
|j  u �rÖ|j  u �rÖ|j  u �rÖ|j  u �rÖd u �sÜn J ‚tdƒ}|jdk�sôJ ‚|j�r J ‚d}|j |¡�sJ ‚|j
|j  u �r\|j  u �r\|j  u �r\|j  u �r\d u �sbn 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:r4   z+The problem is unbounded. (HiGHS Status 10:)r   r   Ústatusr*   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_result_   sd    
ÿ
 ÿ
ÿ
ÿ ÿ
ÿ
ÿ ÿ
ÿ
ÿr?   c                  C   s(   t dƒ} | jdksJ ‚t| jdgƒ d S )Nr   r   )r   r9   r   r8   )r/   r   r   r   Útest_milp_optional_args‡   s    r@   c            
   	   C   sà   d} t | ƒ\}}}}}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	   Z	csc_arrayr   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Ÿ   sB    
  ÿÿ""ÿÿ "ÿÿ&ÿrU   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¡s”t  	|j
ddg¡s”J ‚t| |d
�}t|jdƒ t|j
ddgƒ d S )Nr   r4   r   r   r   )r   é   rV   )ZdtyperJ   rH   rL   gffffffÀgÍÌÌÌÌÌü?gffffff@)r   Z	full_likerN   Zfloat64r   Z	ones_liker   r   r9   Úallcloser8   )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€   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)rK   rH   r4   )r   r   r   )r   r   r   r   )r   r   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   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   ©é   rI   é   é!   é   r   é   rf   ©é'   é   re   é   rf   é   é   é   ©é   ri   é   é   rn   é&   rf   rf   ©é)   rf   rm   é$   rr   ru   rl   rf   ©iÀ  iâ(  i:,  i/  ©r   r   rI   é   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   r|   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!   r"   r>   r$   gš™™™™™¹?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žJ ‚|d
 d us®J ‚|d
 }d}t  || || k¡ræt  || || k¡sêJ ‚t  || |k¡�rt  ||| k¡�sJ ‚t  |t  |¡¡�s.J ‚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   Ú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�sxJ ‚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   r8   )r‹   r+   ÚblZbur   Zconstraints2r`   ra   rŒ   r'   rS   rT   Úrefr   r   r   Útest_three_constraints_16878M  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s‚J ‚|j|j|j |j ksžJ ‚| |j¡ qNt  t  	|¡dk ¡sÄJ ‚d S )Nrd   rj   rq   rv   ry   rz   )g      Ð?g{®Gáz„?gü©ñÒMbP?r   TÚmip_rel_gap)r'   r   r   r   r"   )
r   rO   r   rN   r=   r9   r<   ÚappendrŠ   Údiff)r|   r}   r'   Zmip_rel_gapsZsol_mip_gapsr‘   r/   r   r   r   Útest_mip_rel_gap_passdownf  s"    
ýÿr”   ))Ú__doc__r   Únumpyr   Znumpy.testingr   r   r   Ztest_linprogr   Zscipy.optimizer   r   r   Zscipyr	   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   <ÿ
(%
ÿ
ÿ 