U
    /d?                     @   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  ddddddddddddgddddddddddddgddddddddddddgddddddddddddgddddddddddddgddddddddddddgddddddddd	dddgdddddddddd
ddgddddddd	dddddgdddddddd
ddddgddddddddddddgddddddddddddgg} ddddddddddddgddddddddddddgddddddddd d!dd"gddddd#d$dd%dd&d'd(gdddd#dd)d*dd+dd*d+gdddd$d)dd
d,d-dddgddddd*d
dd.dd/d0dgdddd%dd,d.ddd$d1d2gddd dd+d-dddd)d3d4gddd!d&ddd/d$d)dd5d6gdddd'd*dd0d1d3d5dd7gddd"d(d+ddd2d4d6d7dgg}t | t | } }| jd }t d8d*d	d9dd:d;d<dd/d=d$gd	g|  }| ||fS )>Nr   Z   
      +   X            `      %   $   6   ;   H   	   "   O      .   _   I   #   :      N   ,      a   B   E   =   ?   ]      (   0   D   U   @      L   7   &   S      8      P   '   !   F   V                        )nparrayshape)ABnopt_perm rK   R/tmp/pip-unpacked-wheel-9gxwnfpp/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"  ddddgddddgddddgddddgg}ddddgddddgddddgddddgg}t ||| jdddd}t|jd	 t|jtddddg t ||| jdd
dd}| jdkrt|jd t|jtddddg n&t|jd t|jtddddg t ||| jdd
dd}d S )Nr   r?   r@   rC   r   FrngZmaximizemethodoptionsr	   Tfaqr   r+   )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 ddddgddddgddddgddddgg}t ddddgddddgddddgddddgg}t||| jddd	d
}| jdkrt|jd t|jt ddddg n&t|jd t|jt ddddg t||| jddd	d
}t|jd t|jt ddddg d S )Nr   r0   rA   rB   r   rC   r@   FrV   rX   r[      r?      Ti  )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	d
ddg}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   rl   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   ro   rK   rn   rL   test_unknown_options   s    z#QAPCommonTests.test_unknown_optionsN)	__name__
__module____qualname____doc__rU   r`   rc   rm   rp   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_inputTrd   re   r   Z
randomized)rW   P0rx   )rM   rj   r   r   rk   r   r\   rD   onesfloat_doubly_stochastic)rT   rG   rH   rJ   rI   r_   KrK   rK   rL   test_options   s(    zTestFAQ.test_optionsc              	   C   sP  t d}|}tjtdd t||ddid W 5 Q R X tjtdd t||dd	id W 5 Q R X tjtd
d t||dd	id W 5 Q R X tt t||ddid W 5 Q R X tjtdd* tt dt ddt did W 5 Q R X dddgdddgdddgg}tjtdd$ tt dt dd|id W 5 Q R X d S )NrC   zInvalid 'P0' parametermatchrx   rQ   rw   z$'maxiter' must be a positive integerrv   z'tol' must be a positive floattolg      ?z1`P0` matrix must have shape m' x m', where m'=n-mr@   r?   r?   g?g?g333333?g333333?gffffff?z%`P0` matrix must be doubly stochasticr?   )rD   identitypytestraises
ValueErrorr   	TypeErrorry   )rT   rG   rH   r|   rK   rK   rL   test_specific_input_validation   sF    
     z&TestFAQ.test_specific_input_validationN)rq   rr   rs   rY   r}   r   rK   rK   rK   rL   ru      s   ru   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   rk   )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   rf   r   )rD   rQ   r   r   rY   rE   ri   r]   rh   r   rk   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. ttdtd| jd|ddid W 5 Q R X tjtdd. ttdtd| jdt ddid W 5 Q R X tjtd	d4 ttdtd| jdtj	dddid W 5 Q R X tjtd
d2 ttdtd| jddt dd id W 5 Q R X tjtdd2 ttdtd| jddt dd id W 5 Q R X tjtdd. ttdtd| jdt
did W 5 Q R X 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   ry   rT   Z_rmrK   rK   rL   r     sv                 z'Test2opt.test_specific_input_validationN)rq   rr   rs   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   sZ  t jtdd  ttjdtjd W 5 Q R X t jtdd  ttjdtjd W 5 Q R X t jtdd  ttjdtjd W 5 Q R X t jtdd  ttjdtjd	 W 5 Q R X t}t jtd
d* ttdtdd|ddid W 5 Q R X t jtdd* ttdtddtddid W 5 Q R X t jtdd0 ttdtddtjdddid W 5 Q R X t jtdd. ttdtdddtdd id W 5 Q R X t jtdd. ttdtdddtdd id W 5 Q R X t jtdd* ttdtddt	did W 5 Q R X 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?   rf   r0   rC   rw   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   ry   r   rK   rK   rL   test_common_input_validationM  s    



 



        z(TestQAPOnce.test_common_input_validationN)rq   rr   rs   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rangeri   )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   ZnumpyrD   Zscipy.optimizer   r   Zscipy.optimize._qapr   rg   Znumpy.testingr   r   r   rM   rN   ru   r   r   r   r{   rK   rK   rK   rL   <module>   s   %yHVN