o
    hD                     @   s   d dl Z d dlZd dlm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e jdG d	d
 d
ZG dd deZG dd deZe jdG dd dZdd ZdddZdS )    N)default_rng)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   r1   r2   )r   r    r%   r+   r0   r   r   7   &   r   r   r   )r   r!   r    r   r1   r   r   S   r      8   r   )r   r"   r&   r,   r   r3   r5   r   r#   r+      P   )r   r   r'   r   r2   r4   r   r#   r   r0   '   !   )r   r#   r(   r-   r   r   r6   r+   r0   r   F   V   )r   r   r   r.   r1   r   r7   r8   r:   r<   r      )r   r   r)   r/   r2   r   r   r9   r;   r=   r>   r   r   )   r1   r      r
            r   r6      r+   r   )nparrayshape)ABnopt_perm rL   b/var/www/vscode/kcb/lib/python3.10/site-packages/scipy/optimize/tests/test_quadratic_assignment.pychr12c   s<   

rN   z1ignore:The NumPy global RNG was seeded by callingc                   @   sH   e Zd ZdZdd Zdd Zdd Zejj	dd	 Z
ejj	d
d ZdS )QAPCommonTestsz6
    Base class for `quadratic_assignment` tests.
    c                 C   s  t jd}g dg dg dg dg}g dg dg dg dg}t||| j|d	d
d}t|jd t|jt g d t||| j|dd
d}| jdkrbt|jd t|jt g d nt|jd t|jt g d t||| j|dd
d d S )N   mX)Ec )r   r@   rA   rD   )r   r   r   rD   )r   r   r   r   )r   r   r   r   )r   rA   rD   rA   )r   rD   r   rD   )r   r   rD   r   Frngmaximizemethodoptionsr
   r   rD   r@   r   Tfaqr   )r   rD   r@   r   r,   )r   r@   r   rD   )	rE   randomr   r   rU   r   funcol_indrF   selfrR   rH   rI   resrL   rL   rM   test_accuracy_1;   s6   




zQAPCommonTests.test_accuracy_1c                 C   s   t jd}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}| jdkrKt|jd t|jt g d nt|jd t|jt g d t||| j|ddd}t|jd t|jt g d d S )NrP   )r   r1   rB   rC   )r1   r   r1   r   )rB   r1   r   rD   )rC   r   rD   r   )r   r   rB   rA   )r   r   r1   rD   )rB   r1   r   r1   )rA   rD   r1   r   FrQ   rT   rX      )r   r   r@   rD      rW   Ti  )rD   r@   r   r   )	rE   rY   r   rF   r   rU   r   rZ   r[   r\   rL   rL   rM   test_accuracy_2a   s0   




zQAPCommonTests.test_accuracy_2c           	      C   s  t jd}t \}}}t||| jd|id}td|j  ko"dk n   t|jt	|||j
 t||| j|ddd}td|j  koHd	k n   t|jt	|||j
 t g d
}t ||| gj}t||| j||dd}td|j  kodk n   t|j
| ||  t t t||gj}t||| j||dd}t|j
|d d df j t|jd t|jd t d}t||| jd|id}t|jd t|jd d S )NrP   rR   rT   +  R  TrQ   i! iL )rA   rB   r
   )partial_matchrR   r   r   )r   r   )rE   rY   r   rN   r   rU   r   rZ   r   _scorer[   rF   asarrayTarangelennitempty)	r]   rR   rH   rI   rK   r^   	seed_costseedrl   rL   rL   rM   test_accuracy_3   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-ekkiTrT   )r   rU   rL   rH   rI   r]   rL   rM   f   s   

z.QAPCommonTests.test_unknown_options.<locals>.f)rN   r   r   )r]   rK   rq   rL   rp   rM   test_unknown_options   s   z#QAPCommonTests.test_unknown_optionsc                 C   s  t dd}t dd}tjtdd t jd}t||| j	|ddd W d    n1 s4w   Y  tjt
d	d t jd t||| j	d
did W d    n1 s\w   Y  tjt
dd t||| j	dddd W d    d S 1 sw   Y  d S )Nr   rA   rA   zUse of `RandomState`*matchr   FrQ   rT   z The NumPy global RNG was seeded*rS   z!The behavior when the rng option*)rE   ri   reshapepytestwarnsDeprecationWarningrY   RandomStater   rU   FutureWarningrn   )r]   rH   rI   rR   rL   rL   rM    test_deprecation_future_warnings   s&   


"z/QAPCommonTests.test_deprecation_future_warningsN)__name__
__module____qualname____doc__r_   rb   ro   rw   markthread_unsaferr   r|   rL   rL   rL   rM   rO   2   s    &'
rO   c                   @   s    e Zd ZdZdd Zdd ZdS )TestFAQrX   c                 C   s   t jd}t \}}}t|}t||ddid}t|jd t||ddid}td|j	  ko3dk n   t|||d	d
d}td|j	  koLdk n   t 
||ft| }t|}t||d|id}td|j	  kovdk  d S    d S )NrP   maxiterr1   rV   shuffle_inputTrc   rd   
randomized)rR   P0r   )rE   rY   r   rN   rj   r   r   rk   r   rZ   onesfloat_doubly_stochastic)r]   rR   rH   rI   rK   rJ   r^   KrL   rL   rM   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 s"w   Y  tjtdd t||dd	id W d    n1 sBw   Y  tjtd
d t||dd	id W d    n1 sbw   Y  tt t||ddid W d    n1 sw   Y  tjtdd tt dt ddt did W d    n1 sw   Y  g dg dg dg}tjtdd tt dt dd|id W d    d S 1 sw   Y  d S )NrD   zInvalid 'P0' parameterrt   r   rY   r   z$'maxiter' must be a positive integerr   z'tol' must be a positive floattolg      ?z1`P0` matrix must have shape m' x m', where m'=n-mrA   r@   r@   )g?皙?333333?)r   g333333?r   )r   r   gffffff?z%`P0` matrix must be doubly stochasticr@   )rE   identityrw   raises
ValueErrorr   	TypeErrorr   )r]   rH   rI   r   rL   rL   rM   test_specific_input_validation   sH   
"z&TestFAQ.test_specific_input_validationN)r}   r~   r   rU   r   r   rL   rL   rL   rM   r      s    r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Test2opt2optc                 C   s   d}t d}|j||fd}|j||fd}t||| jd|id}t d}|j||fd}|j||fd}t||| jd|id}t|j|j d S )N   i<2sizerR   rT   )r   rY   r   rU   r   rk   )r]   rJ   rR   rH   rI   res1res2rL   rL   rM   test_deterministic  s   zTest2opt.test_deterministicc                 C   s
  d}t jd}|j||fd}|j||fd}t||| jd|id}t t d|jgj}t||| j||dd}ddg}t t d| |j| gj}	t||| j|||	d	d}
t	|j
||d
  d k t|j
||d
  d  t|
j
|d |d
  d  d S )Nr1   rP   r   rR   rT   )rR   partial_guessrD   rA   )rR   r   re   r   )rE   rY   r   r   rU   rF   ri   r[   rh   r   rk   r   )r]   rJ   rR   rH   rI   r   guessr   fixru   res3rL   rL   rM   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 d    n1 s(w   Y  tjtdd ttdtd| jdt ddid W d    n1 sSw   Y  tjtd	d ttdtd| jdtj	dddid W d    n1 sw   Y  tjtd
d ttdtd| jddt dd id W d    n1 sw   Y  tjtdd ttdtd| jddt dd id W d    n1 sw   Y  tjtdd ttdtd| jdt
did W d    d S 1 sw   Y  d S )Nz0`partial_guess` can have only as many entries asrt   r@   r   r1   rD   rT   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 numberrA   z-`partial_guess` column entries must be uniquerD   rD   )_range_matrixrw   r   r   r   rE   r   rU   rY   randr   )r]   _rmrL   rL   rM   r   0  sh   $z'Test2opt.test_specific_input_validationN)r}   r~   r   rU   r   r   r   rL   rL   rL   rM   r   
  s
    r   c                   @   s   e Zd Zdd ZdS )TestQAPOncec              
   C   s$  t d}tjtdd t|d|d W d    n1 s!w   Y  tjtdd t|d|d W d    n1 sCw   Y  tjtdd t|d|d W d    n1 sew   Y  tjtd	d t|d|d
 W d    n1 sw   Y  t}tjtdd ttdtdd|ddid W d    n1 sw   Y  tjtdd ttdtddtddid W d    n1 sw   Y  tjtdd ttdtddtj	dddid W d    n	1 sw   Y  tjtdd ttdtdddtdd id W d    n	1 s4w   Y  tjtdd ttdtdddtdd id W d    n	1 s`w   Y  tjtdd ttdtddt
did W d    d S 1 sw   Y  d S )Ninn z`A` must be squarert   )r@   rA   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 sizers   z.`partial_match` can have only as many seeds asr@   re   r1   rD   r   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 numberrA   z-`partial_match` column entries must be uniquer   )r   rw   r   r   r   rY   r   rE   r   r   r   )r]   rR   r   rL   rL   rM   test_common_input_validationd  s   $z(TestQAPOnce.test_common_input_validationN)r}   r~   r   r   rL   rL   rL   rM   r   `  s    r   c                 C   s6   t | |f}t|D ]}t | |d d |f< q|S )N)rE   zerosrangeri   )abmatirL   rL   rM   r     s   r   MbP?c                 C   s   d}d| j dd }d| |  }| }t|D ];}t|j ddd |k  r9t|j ddd |k  r9 |S d||   }d| |  }|d d d f |  | }q|S )Ni  r   r   )axis)sumr   rE   absall)Pr   max_itercrP_epsitrL   rL   rM   r     s   r   )r   )rw   numpyrE   numpy.randomr   scipy.optimizer   r   scipy.optimize._qapr   rf   numpy.testingr   r   r   rN   r   filterwarningsrO   r   r   r   r   r   rL   rL   rL   rM   <module>   s     
% F
VM