a
    Re?                     @   s   d dl Z d dlZd dlmZmZ d dlmZ d dl	m
Z
mZmZ dd ZG dd dZG d	d
 d
eZG dd deZG dd dZdd ZdddZdS )    N)quadratic_assignmentOptimizeWarning)_calc_score)assert_equalassert_assert_warnsc                  C   s   g dg dg dg dg dg dg dg dg d	g d
g dg dg} g dg dg dg dg dg dg dg dg dg dg dg dg}t | t | } }| jd }t g ddg|  }| ||fS )N)r   Z   
   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   X   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   $   6   r   ;   H   	   "   O      .   _   )r   r   I   #   r   :      N   r   ,   r   r   )r   r   r      r	   a   r   B   E   =   r   ?   )r   r   r#   r   ]      r   (   r   0   D   U   )r   r   r	   r)   r   @      r   L   r   r0   r1   )r   r   r$   r*   r/   r   r   7   &   r   r   r   )r   r    r   r   r0   r   r   S   r      8   r   )r   r!   r%   r+   r   r2   r4   r   r"   r*      P   )r   r   r&   r   r1   r3   r   r"   r   r/   '   !   )r   r"   r'   r,   r   r   r5   r*   r/   r   F   V   )r   r   r   r-   r0   r   r6   r7   r9   r;   r      )r   r   r(   r.   r1   r   r   r8   r:   r<   r=   r   r   )   r0   r      r	            r   r5      r*   r   )nparrayshape)ABnopt_perm rK   b/var/www/sunrise/env/lib/python3.9/site-packages/scipy/optimize/tests/test_quadratic_assignment.pychr12c   s<    
rM   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )QAPCommonTestsz6
    Base class for `quadratic_assignment` tests.
    c                 C   s   t jd d S Nr   rD   randomseedselfrK   rK   rL   setup_method5   s    zQAPCommonTests.setup_methodc                 C   s   g dg dg dg dg}g dg dg dg dg}t ||| jdd	d
d}t|jd t|jtg d t ||| jddd
d}| jdkrt|jd t|jtg d n"t|jd t|jtg d t ||| jddd
d}d S )N)r   r?   r@   rC   )r   r   r   rC   )r   r   r   r   )r   r   r   r   )r   r@   rC   r@   )r   rC   r   rC   )r   r   rC   r   r   FrngZmaximizemethodoptionsr	   r   rC   r?   r   Tfaqr   )r   rC   r?   r   r+   )r   r?   r   rC   )r   rY   r   funcol_indrD   rE   rT   rG   rH   resrK   rK   rL   test_accuracy_1<   s4    



zQAPCommonTests.test_accuracy_1c                 C   s   t g dg dg dg dg}t g dg dg dg dg}t||| jd	d
dd}| jdkrt|jd t|jt g d n"t|jd t|jt g d t||| jd	ddd}t|jd t|jt g d d S )N)r   r0   rA   rB   )r0   r   r0   r   )rA   r0   r   rC   )rB   r   rC   r   )r   r   rA   r@   )r   r   r0   rC   )rA   r0   r   r0   )r@   rC   r0   r   r   FrV   rX   r\      )r   r   r?   rC      r[   Ti  )rC   r?   r   r   )rD   rE   r   rY   r   r]   r^   r_   rK   rK   rL   test_accuracy_2_   s.    




zQAPCommonTests.test_accuracy_2c                 C   s  t  \}}}t||| jddid}td|j  ko8dk n   t|jt|||j t||| jdddd}td|j  kod	k n   t|jt|||j t	g d
}t
||| gj}t||| jd|id}td|j  kodk n   t|j| ||  t
tt||gj}t||| jd|id}t|j|d d df j t|jd t|jd td}t||| jddid}t|jd t|jd d S )NrW   r   rX   +  R  TrV   i! iL )r@   rA   r	   partial_matchr   )r   r   )rM   r   rY   r   r]   r   _scorer^   rD   rE   ZasarrayTarangelennitempty)rT   rG   rH   rJ   r`   Z	seed_costrR   rm   rK   rK   rL   test_accuracy_3z   s>    





zQAPCommonTests.test_accuracy_3c                    s*   t  \ } fdd}tt| d S )Nc                      s   t  jddid d S )Nz	ekki-ekkiTrX   )r   rY   rK   rG   rH   rT   rK   rL   f   s    
z.QAPCommonTests.test_unknown_options.<locals>.f)rM   r   r   )rT   rJ   rp   rK   ro   rL   test_unknown_options   s    z#QAPCommonTests.test_unknown_optionsN)	__name__
__module____qualname____doc__rU   ra   rd   rn   rq   rK   rK   rK   rL   rN   1   s   #'rN   c                   @   s    e Zd ZdZdd Zdd ZdS )TestFAQr\   c                 C   s   t  \}}}t|}t||ddid}t|jd t||ddid}td|j  koZdk n   t||dd	d
d}td|j  kodk n   t||ft	| }t
|}t||d|id}td|j  kodk n   d S )Nmaxiterr0   rZ   Zshuffle_inputTre   rf   r   Z
randomized)rW   P0ry   )rM   rk   r   r   rl   r   r]   rD   onesfloat_doubly_stochastic)rT   rG   rH   rJ   rI   r`   KrK   rK   rL   test_options   s(    zTestFAQ.test_optionsc                 C   s  t d}|}tjtdd" t||ddid W d    n1 sD0    Y  tjtdd" t||dd	id W d    n1 s0    Y  tjtd
d" t||dd	id W d    n1 s0    Y  tt" t||ddid W d    n1 s0    Y  tjtdd4 tt dt ddt did W d    n1 sV0    Y  g dg dg dg}tjtdd. tt dt dd|id W d    n1 s0    Y  d S )NrC   zInvalid 'P0' parametermatchry   rQ   rx   z$'maxiter' must be a positive integerrw   z'tol' must be a positive floattolg      ?z1`P0` matrix must have shape m' x m', where m'=n-mr@   r?   r?   )g?皙?333333?)r   g333333?r   )r   r   gffffff?z%`P0` matrix must be doubly stochasticr?   )rD   identitypytestraises
ValueErrorr   	TypeErrorrz   )rT   rG   rH   r}   rK   rK   rL   test_specific_input_validation   s<    
0002&z&TestFAQ.test_specific_input_validationN)rr   rs   rt   rY   r~   r   rK   rK   rK   rL   rv      s   rv   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Test2optZ2optc                 C   sz   d}t j||}t j||}t||| jd}t jd t j||}t j||}t||| jd}t|j|j d S )N   )rY   r   )rD   rQ   randr   rY   rR   r   rl   )rT   rI   rG   rH   res1res2rK   rK   rL   test_deterministic   s    zTest2opt.test_deterministicc           
      C   s   d}t j||}t j||}t||| jddid}t t d|jgj}t||| jd|dd}ddg}t t d| |j| gj}t||| jd||dd}	t	|j
||d	  d k t|j
||d	  d  t|	j
|d |d	  d  d S )
Nr0   rW   r   rX   )rW   partial_guessrC   r@   )rW   r   rg   r   )rD   rQ   r   r   rY   rE   rj   r^   ri   r   rl   r   )
rT   rI   rG   rH   r   guessr   Zfixr   Zres3rK   rK   rL   test_partial_guess  s(    

 
zTest2opt.test_partial_guessc                 C   s"  t }tjtdd8 ttdtd| jd|ddid W d    n1 sP0    Y  tjtdd8 ttdtd| jdt ddid W d    n1 s0    Y  tjtd	d> ttdtd| jdtj	dddid W d    n1 s0    Y  tjtd
d< ttdtd| jddt dd id W d    n1 s`0    Y  tjtdd< ttdtd| jddt dd id W d    n1 s0    Y  tjtdd8 ttdtd| jdt
did W d    n1 s0    Y  d S )Nz0`partial_guess` can have only as many entries asr   r?   r   r0   rC   rX   z%`partial_guess` must have two columnsz%`partial_guess` must have exactly twoz%`partial_guess` must contain only posr   z0`partial_guess` entries must be less than numberr@   z-`partial_guess` column entries must be uniquerC   rC   )_range_matrixr   r   r   r   rD   r   rY   rQ   r   rz   rT   Z_rmrK   rK   rL   r     s\    $$&&&z'Test2opt.test_specific_input_validationN)rr   rs   rt   rY   r   r   r   rK   rK   rK   rL   r      s   r   c                   @   s   e Zd Zdd Zdd ZdS )TestQAPOncec                 C   s   t jd d S rO   rP   rS   rK   rK   rL   rU   I  s    zTestQAPOnce.setup_methodc              
   C   s0  t jtdd* ttjdtjd W d    n1 s>0    Y  t jtdd* ttjdtjd W d    n1 s0    Y  t jtdd* ttjdtjd W d    n1 s0    Y  t jtdd* ttjdtjd	 W d    n1 s0    Y  t}t jtd
d4 ttdtdd|ddid W d    n1 sp0    Y  t jtdd4 ttdtddtddid W d    n1 s0    Y  t jtdd: ttdtddtjdddid W d    n1 s0    Y  t jtdd8 ttdtdddtdd id W d    n1 sv0    Y  t jtdd8 ttdtdddtdd id W d    n1 s0    Y  t jtdd4 ttdtddt	did W d    n1 s"0    Y  d S )Nz`A` must be squarer   )r?   r@   r   z`B` must be squarez!`A` and `B` must have exactly two)r?   r?   r?   z*`A` and `B` matrices must be of equal size)r@   r@   z.`partial_match` can have only as many seeds asr?   rg   r0   rC   rx   z%`partial_match` must have two columnsz%`partial_match` must have exactly twoz%`partial_match` must contain only posr   z0`partial_match` entries must be less than numberr@   z-`partial_match` column entries must be uniquer   )
r   r   r   r   rD   rQ   r   r   r   rz   r   rK   rK   rL   test_common_input_validationM  s    

"

"

"

$&&&&&z(TestQAPOnce.test_common_input_validationN)rr   rs   rt   rU   r   rK   rK   rK   rL   r   H  s   r   c                 C   s6   t | |f}t|D ]}t | |d d |f< q|S )N)rD   zerosrangerj   )abmatirK   rK   rL   r     s    r   MbP?c                 C   s   d}d| j dd }d| |  }| }t|D ]t}t|j ddd |k  rpt|j ddd |k  rp qd||   }d| |  }|d d d f |  | }q,|S )Ni  r   r   )Zaxis)sumr   rD   absall)Pr   Zmax_itercrZP_epsitrK   rK   rL   r|     s    r|   )r   )r   numpyrD   Zscipy.optimizer   r   Zscipy.optimize._qapr   rh   Znumpy.testingr   r   r   rM   rN   rv   r   r   r   r|   rK   rK   rK   rL   <module>   s   %yHVN