o
    Ö­j~G  ã                
   @   s„  d Z ddl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 ejdk 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"Z!d#Z"ejj#ejjd$d%�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/d0„ Z*ejjd1d2„ ƒZ+ejjd3d%�d4d5„ ƒZ,d6d7„ Z-dS )8z0
Unit test for Mixed Integer Linear Programming
é    N)Úassert_allcloseÚassert_array_equalé   )Úmagic_square)ÚmilpÚBoundsÚLinearConstraint)Úsparsel        c                  C   sD  d} t jt| d�� tt ddg¡ƒ W d   ƒ n1 sw   Y  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 sXw   Y  t jt| d�� td ƒ W d   ƒ n1 ssw   Y  d} t jt| d�� tddd	� W d   ƒ n1 s’w   Y  d
} t jtt 	| ¡d�� tddd� W d   ƒ n1 s´w   Y  t jtt 	| ¡d�� tt d¡g d¢gddgddgfd� W d   ƒ n1 sáw   Y  t jtt 	| ¡d�� tt d¡ddggdgt dg¡fd� W d   ƒ n	1 �sw   Y  d} t jtt 	| ¡d�� tt d¡ddggdgdgfd� W d   ƒ n	1 �s>w   Y  d} t jt| d�� tddgt ddg¡d� W d   ƒ n	1 �sew   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 �s«w   Y  d} t jt| d�� tg d¢ddgt ddg¡fd	� W d   ƒ n	1 �sÖw   Y  d} t jt| d�� tg d¢ddgg d¢fd	� W d   ƒ n	1 �sþw   Y  t jt| d�� tg d¢g d¢ddgfd	� W d   ƒ n	1 �s$w   Y  d} t jt| d�� tg d¢ddgddgfd	� W d   ƒ n	1 �sLw   Y  t jt| d�� tg d¢g d¢g d¢fd	� W d   ƒ n	1 �srw   Y  t jt| d�� tg d¢g d¢t
ƒ ddgfd	� W d   ƒ d S 1 �s›w   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   )ÚpytestÚraisesÚ
ValueErrorr   r	   Ú	coo_arrayÚnpÚzerosÚreÚescapeÚset)Úmessage© r   ú[/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/optimize/tests/test_milp.pyÚtest_milp_iv   s€   ÿÿ
ÿ
ÿÿÿ(ÿ*ÿ$ÿÿÿÿ$ÿÿÿÿÿ"$ÿ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_optionsN   s   ÿÿr9   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 |¡s‚J ‚|j
|j  u r¡|j  u r¡|j  u r¡|j  u r¡d u s¤J ‚ J ‚tdd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 sâJ ‚ 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 �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   Ústatusr1   r   Ú
startswithÚ
isinstanceÚxr   ÚndarrayÚfunÚfloatÚmip_node_countÚintÚmip_dual_boundÚmip_gap)r3   r4   r,   r5   r6   r7   Úmsgr   r   r    Útest_resultb   sd   
ÿ
ÿÿÿ
ÿÿÿ
 
ÿ
ÿÿrJ   c                  C   s(   t dƒ} | jdksJ ‚t| jdgƒ d S )Nr   r   )r   rC   r   rA   )r7   r   r   r    Útest_milp_optional_argsŠ   s   rK   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   r:   r   )Úaxisr=   )r   r	   Ú	csc_arrayr   r   ÚroundrA   ÚflattenÚreshapeÚsumÚtestingr   Údiag)
Únr3   r4   r,   r5   r6   r7   rA   ÚsÚsquarer   r   r    Útest_milp_1‘   s   
.rW   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   ÚarrayrA   rC   rR   r   Úbroadcast_toÚshape)r,   r3   Úb_lÚb_uÚlinear_constraintÚres1Úres2Úres3Úres4Úres5Úres6Úres7ÚxsÚfunsr7   r   r   r    Útest_milp_2¢   sB   
  ÿÿ""ÿÿ "ÿÿ&ÿrn   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   é   ro   )ÚdtyperZ   rX   r\   gffffffÀgÍÌÌÌÌÌü?gffffff@)r   Ú	full_liker^   Úfloat64r   Ú	ones_liker   r   rC   ÚallcloserA   )r,   r3   rc   rb   r   r   r7   r   r   r    Útest_milp_3Ç   s   
(ru   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=   iòÿÿÿißÿÿÿé   ©r   r   r   é;   g      @é   )r   r^   r   r   r   r   rC   rA   )r,   r   r3   rb   rc   r   r   r7   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)r[   rX   r=   )r   r   r   )r   r   r   r   )r   r   r   )r   r   r   ro   r{   ry   iôÿÿÿ)r   r^   r   r   r   r   rC   )
r,   r   ÚlbÚubr   r3   rb   rc   r   r7   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   ©é   rY   é   é!   é   r   é   r‚   ©é'   é   r�   é   r‚   é   é   é   ©é   r…   é   é   rŠ   é&   r‚   r‚   ©é)   r‚   r‰   é$   rŽ   r‘   rˆ   r‚   ©iÀ  iâ(  i:,  i/  ©r   r   rY   é   r{   r   r{   r   rZ   i>  )r   r_   r   rR   r   rC   )r   ÚA_eqÚb_eqr,   r7   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 )Nç      ð?ç        r   r   g      à?ry   r   )r   r^   r   r   r   rR   Úassert_equalr>   )	r,   r   r}   r~   r   r˜   r™   r   r7   r   r   r    Útest_infeasible_prob_16609  s   

ÿrž   r<   z*Iteration limit reached. (HiGHS Status 14:z-Often buggy, revisit with callbacks, gh-19255)r#   rv   zUnhandled 32-bit GCC FP bugr%   rI   r)   gš™™™™™¹?Ú
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¡r‡t  ||| k¡s‰J ‚t  |t  |¡¡s”J ‚d S )Nì   $sƒ¥Ü8 r   r   )éd   r¡   ©Úsizer¡   ©Ú
fill_valueé   )r   r   r   r%   rA   g:Œ0âŽyE>)r   ÚrandomÚdefault_rngÚintegersÚfullr^   r   r   r]   r   r   r   r?   Úallrt   rN   )r%   rI   Úrngr3   Úb_lbÚb_ubr   Úvariable_lbÚvariable_ubÚvariable_boundsr   Úc_vectorr7   rA   Ú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sºJ ‚t|
j|jƒ t|j|jƒ d S )Nr    r   r   )r;   r;   r¢   r;   r¤   r   r   r   )r   r   )r   r§   r¨   r©   rª   r^   r   r   r]   r   r   r1   r   rA   )r¬   r3   ÚblÚbur   Úconstraints2r}   r~   r±   r,   re   rf   Úrefr   r   r    Útest_three_constraints_16878Q  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{®Gáz„?gü©ñÒMbP?r   TÚmip_rel_gap)r,   r   r   r   r%   )
r   r_   r   r^   rH   rC   rG   Úappendr«   Údiff)r˜   r™   r,   Úmip_rel_gapsÚsol_mip_gapsrº   r7   r   r   r    Útest_mip_rel_gap_passdownj  s"   
ýÿr¿   z&Upstream / Wrapper issue, see gh-20116c                  C   s�   d} t  d| gd|  gg¡}t  | dg¡}t||d�}tddgddgƒ}t  ddg¡}t|||dd�}|jdks:J ‚t  ||j |k ¡sFJ ‚d S )Nl    J)£gi o�Y@r   )r3   r~   r   r:   )r   r_   r   r   r   r>   r«   rA   )Úhr3   r4   r   r   r,   r7   r   r   r    Útest_large_numbers_gh20116‡  s   rÁ   c                  C   s´  ddl m}  dd l}|j}| g d¢¡}| g d¢g d¢g d¢g d¢g d¢g d	¢g d
¢g d¢g d¢g	¡}| | | | | | | | | | g	¡}| g d¢¡}t|||ƒ}d}d}	| ||||	ddid�}
| ||||	ddid�}|
j|jkszJ ‚t|
j|jƒ t	ddd�}	g d¢}g d¢}g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g}g d¢}t||d�}| |||	|ddid �}
| |||	|ddid �}|
j|jksÑJ ‚t|
j|jƒ d S )!Nr   )r   )g4üŸªßxë¿gñUŸi‘†ê¿gûYnaÄ›é¿g)Èt�;*ä¿g±¾&Qà¿gˆZÃÚRà¿gŠÕÕÓýRß¿g�]XíPCÞ¿g>]¼£ïƒÙ¿gLÊY¯T]Ø¿çž1V‚×¿rÂ   gÑ‰oîÐìÖ¿gz|RXo5Ô¿g[TrëÁfÊ¿g×LßçÏé¿¿gÈ2’wíV»¿çÖj´Á./»¿rÃ   rÃ   ç       €rÄ   rÄ   rÄ   rœ   rœ   rœ   rœ   )r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   r›   rœ   rœ   rœ   rœ   )rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   r›   rœ   rœ   rœ   rœ   rœ   r›   rœ   rœ   rœ   ç      9ÀrÄ   rÄ   rÄ   )rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   ç      ð¿rœ   rœ   rœ   rœ   rœ   rÆ   rœ   rœ   rœ   ç       @rœ   rœ   rœ   )rœ   rœ   rœ   rœ   r›   r›   r›   r›   rœ   r›   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rÄ   rÅ   rÄ   rÄ   )rœ   rœ   rœ   rœ   rÆ   rÆ   rÆ   rÆ   rœ   rÆ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rÇ   rœ   rœ   )rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   r›   r›   r›   rœ   rœ   rœ   rœ   rÄ   rÄ   rÅ   rÄ   )rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   rÆ   rÆ   rÆ   rœ   rœ   rœ   rœ   rœ   rœ   rÇ   rœ   )r›   r›   r›   r›   rœ   rœ   rœ   rœ   r›   rœ   r›   r›   r›   r›   rœ   r›   r›   rœ   rœ   rœ   rœ   r›   r›   r›   rÄ   rÄ   rÄ   rÅ   )rÆ   rÆ   rÆ   rÆ   rœ   rœ   rœ   rœ   rÆ   rœ   rÆ   rÆ   rÆ   rÆ   rœ   rÆ   rÆ   rœ   rœ   rœ   rœ   rÆ   rÆ   rÆ   rœ   rœ   rœ   rÇ   )	g      Y@rœ   rœ   rœ   rœ   rœ   rœ   rœ   rœ   r   r*   r(   T)r,   r   r   r   r%   F)r}   r~   )r   r   r   r   )r   gˆwëÂ0#@iüÿÿgxëÂ0Ã�À)r   r   r   r   )éÈ   r   r   r   )r   rÈ   r   r   )r   r   éÐ  r   )r   r   r   rÉ   )r=   r   r   r   )r=   r=   r   r   )r   r   rÈ   rÈ   éè  rÊ   r   r   )r~   r+   )
Úscipy.optimizer   Únumpyr^   r_   r   r>   r   rA   r   )r   r   r^   r,   r3   rµ   r¶   r   r   r   Úr1Úr2r~   r   r   r    Útest_presolve_gh18907”  sV   
ð.
ÿ
ÿÿÿÿrÏ   ).Ú__doc__r   ÚsysrÌ   r   Únumpy.testingr   r   r   Útest_linprogr   rË   r   r   r   Úscipyr	   ÚmaxsizeÚ	_IS_32BITr!   ÚmarkÚxfailr9   rJ   rK   rW   rn   ru   r|   r   Úxslowrš   rž   Ú	_msg_timeÚ	_msg_iterÚthread_unsafeÚskipifÚintpÚitemsizeÚslowÚparametrizer´   r¹   r¿   rÁ   rÏ   r   r   r   r    Ú<module>   sV    
<ÿ
(%
ÿ
ÿ 

