U
    9%e*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   ]/var/www/html/Darija-Ai-API/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st|jrt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stt|jtstt|jtstt d\} }}}}t|d | ||fdddd	id
}|jdkst|jrt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|st|j|j  kr|j  kr|j  kr|j  krd ksn ttd}|jdkst|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   ir   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st 	|j
ddgst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   ii   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|st|d
 d k	st|d
 }d}t || || krt || || kst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:0yE>)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st|j|j|j |j kst||j qt 	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{Gz?gMbP?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   .
(%


 