
    tKg?                         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 Z G d d      Z G d d	e      Z G d
 de      Z G d d      Zd ZddZy)    N)quadratic_assignmentOptimizeWarning)_calc_score)assert_equalassert_assert_warnsc                  R   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        j                  |       t        j                  |      }} | j                  d   }t        j                  g d      dg|z  z
  }| ||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   r2   r3   )r   r!   r&   r,   r1   r   r   7   &   r   r   r   )r   r"   r!   r   r2   r   r   S   r       8   r   )r   r#   r'   r-   r   r4   r6   r   r$   r,      P   )r   r    r(   r   r3   r5   r    r$   r   r1   '   !   )r   r$   r)   r.   r   r   r7   r,   r1   r   F   V   )r   r   r   r/   r2   r   r8   r9   r;   r=   r      )r   r   r*   r0   r3   r   r   r:   r<   r>   r?   r   r   )   r2   r      r            r   r7      r,   r   )nparrayshape)ABnopt_perms       r/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/optimize/tests/test_quadratic_assignment.pychr12crN      s    ......-.-.--	A 	777756577757	A 88A;qA	
Axx?@A37JHa>    c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)QAPCommonTestsz6
    Base class for `quadratic_assignment` tests.
    c                 B    t         j                  j                  d       y Nr   rF   randomseedselfs    rM   setup_methodzQAPCommonTests.setup_method5       
		qrO   c                    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        j                  g d             t        ||| j                  ddd
      }| j                  dk(  rBt        |j                  d       t        |j                  t        j                  g d             nAt        |j                  d       t        |j                  t        j                  g d             t        ||| j                  ddd
      }y )N)r   rA   rB   rE   )r   r   r   rE   )r   r   r   r   )r   r   r   r   )r   rB   rE   rB   )r   rE   r   rE   )r   r   rE   r   r   Frngmaximizemethodoptionsr   r   rE   rA   r   Tfaqr   )r   rE   rA   r   r-   )r   rA   r   rE   )r   r`   r   funcol_indrF   rG   rX   rI   rJ   ress       rM   test_accuracy_1zQAPCommonTests.test_accuracy_1<   s    
 
 #1a34%+HJSWWb!S[["((<"89"1a34$+GI ;;%"%bhh|&<="%bhh|&<="1a34$+GIrO   c                    t        j                  g dg dg dg dg      }t        j                  g dg dg dg dg      }t        ||| j                  d	d
d      }| j                  dk(  rBt	        |j
                  d       t	        |j                  t        j                  g d             nAt	        |j
                  d       t	        |j                  t        j                  g d             t        ||| j                  d	dd      }t	        |j
                  d       t	        |j                  t        j                  g d             y )N)r   r2   rC   rD   )r2   r   r2   r   )rC   r2   r   rE   )rD   r   rE   r   )r   r   rC   rB   )r   r   r2   rE   )rC   r2   r   r2   )rB   rE   r2   r   r   Fr\   r_   rc      )r   r   rA   rE      rb   Ti  )rE   rA   r   r   )rF   rG   r   r`   r   rd   re   rf   s       rM   test_accuracy_2zQAPCommonTests.test_accuracy_2_   s    HHl"""$ %
 HHl"""$ %
 #1a34%+HJ;;%#&bhh|&<=#&bhh|&<="1a34$+GISWWc"S[["((<"89rO   c                    t               \  }}}t        ||| j                  ddi      }t        d|j                  cxk  xr dk  nc        t        |j                  t        |||j                               t        ||| j                  ddd      }t        d|j                  cxk  xr d	k  nc        t        |j                  t        |||j                               t        j                  g d
      }t        j                  |||   g      j                  }t        ||| j                  d|i      }t        d|j                  cxk  xr dk  nc        t        |j                  |   ||          t        j                  t        j                  t        |            |g      j                  }t        ||| j                  d|i      }t        |j                  |d d df   j                         t        |j                  d       t        |j                  d       t        j                  d      }t        ||| j                  ddi      }t        |j                  d       t        |j                  d       y )Nr]   r   r_   +  R  Tr\   i! iL )rB   rC   r   partial_matchr   )r   r   )rN   r   r`   r   rd   r   _scorere   rF   rG   asarrayTarangelennitempty)rX   rI   rJ   rL   rg   	seed_costrV   rw   s           rM   test_accuracy_3zQAPCommonTests.test_accuracy_3z   s   1h #1a,11:7(5()SWWfQ3;;78 #1a34$+GI(5()SWWfQ3;;78 HHZ(	zz9hy&9:;=="1a,;T+BD(5()S[[+Xi-@A zz299SV,h78::"1a,;T+BDS[[$q!t*,,/SWWe$SWWa   "5%,11:7SWWa SWWa rO   c                 T     t               \  } fd}t        t        |       y )Nc                  <    t         j                  ddi       y )Nz	ekki-ekkiTr_   )r   r`   )rI   rJ   rX   s   rM   fz.QAPCommonTests.test_unknown_options.<locals>.f   s     Adkk*5t)<>rO   )rN   r   r   )rX   rL   r|   rI   rJ   s   `  @@rM   test_unknown_optionsz#QAPCommonTests.test_unknown_options   s!    1h	> 	_a(rO   N)	__name__
__module____qualname____doc__rY   rh   rl   ry   r}    rO   rM   rQ   rQ   1   s#    IF:6%!N)rO   rQ   c                       e Zd ZdZd Zd Zy)TestFAQrc   c                    t               \  }}}t        |      }t        ||ddi      }t        |j                  d       t        ||ddi      }t        d|j                  cxk  xr dk  nc        t        ||dd	d
      }t        d|j                  cxk  xr dk  nc        t        j                  ||f      t        |      z  }t        |      }t        ||d|i      }t        d|j                  cxk  xr
 dk         y c        y )Nmaxiterr2   ra   shuffle_inputTrn   ro   r   
randomized)r]   P0r   )rN   ru   r   r   rv   r   rd   rF   onesfloat_doubly_stochastic)rX   rI   rJ   rL   rK   rg   Ks          rM   test_optionszTestFAQ.test_options   s    1hF #1a,5q>;SWWa  #1a,;T+BD(5() #1a34L+IK(5() GGQFOeAh&q!"1a,0!96(5()()rO   c           	      
   t        j                  d      }|}t        j                  t        d      5  t        ||ddi       d d d        t        j                  t        d      5  t        ||dd	i       d d d        t        j                  t        d
      5  t        ||dd	i       d d d        t        j                  t              5  t        ||ddi       d d d        t        j                  t        d      5  t        t        j                  d      t        j                  d      dt        j                  d      i       d d d        g dg dg dg}t        j                  t        d      5  t        t        j                  d      t        j                  d      d|i       d d d        y # 1 sw Y   wxY w# 1 sw Y   PxY w# 1 sw Y   )xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)NrE   zInvalid 'P0' parametermatchr   rU   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-mrB   rA   rA   )g?皙?333333?)r   g333333?r   )r   r   gffffff?z%`P0` matrix must be doubly stochasticrA   )rF   identitypytestraises
ValueErrorr   	TypeErrorr   )rX   rI   rJ   r   s       rM   test_specific_input_validationz&TestFAQ.test_specific_input_validation   s   KKN ]]:-EF Ah/?@ G]]"HJ A	2?J ]]:-MN Ar{; O
 ]]9% A	3/?@ & ]]IK !AArwwv/K  ]]"IK AAq	K K5 GFJ J ON
 &%K KK KsH   F9'GGG A
G-97G99GGG G*-G69HN)r~   r   r   r`   r   r   r   rO   rM   r   r      s    F*6'rO   r   c                   "    e Zd ZdZd Zd Zd Zy)Test2opt2optc                    d}t         j                  j                  ||      }t         j                  j                  ||      }t        ||| j                        }t         j                  j                  d       t         j                  j                  ||      }t         j                  j                  ||      }t        ||| j                        }t        |j                  |j                         y )N   )r`   r   )rF   rU   randr   r`   rV   r   rv   )rX   rK   rI   rJ   res1res2s         rM   test_deterministiczTest2opt.test_deterministic   s    IINN1a IINN1a #Aq=
		qIINN1a IINN1a #Aq=TXXtxx(rO   c           	          d}t         j                  j                  ||      }t         j                  j                  ||      }t        ||| j                  ddi      }t        j
                  t        j                  d      |j                  g      j                  }t        ||| j                  d|d      }ddg}t        j
                  t        j                  d      |   |j                  |   g      j                  }t        ||| j                  d||d      }	t        |j                  ||d	z   z  dz  k7         t        |j                  ||d	z   z  dz         t        |	j                  |dz
  |d	z
  z  dz         y )
Nr2   r]   r   r_   )r]   partial_guessrE   rB   )r]   r   rp   r   )rF   rU   r   r   r`   rG   rt   re   rs   r   rv   r   )
rX   rK   rI   rJ   r   guessr   fixr   res3s
             rM   test_partial_guesszTest2opt.test_partial_guess  s>   IINN1a IINN1a #Aq-2AJ8"))A,5688#Aq45,NP!f"))A,s+T\\#->?@BB#Aq45>C-EF 	AqsGAI%&TXXq!A#wqy)TXX!ac{1}-rO   c                    t         }t        j                  t        d      5  t	        t        j                  d      t        j                  d      | j                  d |dd      i       d d d        t        j                  t        d      5  t	        t        j                  d      t        j                  d      | j                  dt        dd      i       d d d        t        j                  t        d	      5  t	        t        j                  d      t        j                  d      | j                  dt
        j                  j                  ddd      i       d d d        t        j                  t        d
      5  t	        t        j                  d      t        j                  d      | j                  ddt        dd      z  i       d d d        t        j                  t        d      5  t	        t        j                  d      t        j                  d      | j                  ddt        dd      z  i       d d d        t        j                  t        d      5  t	        t        j                  d      t        j                  d      | j                  dt        j                  d      i       d d d        y # 1 sw Y   ZxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nz0`partial_guess` can have only as many entries asr   rA   r   r2   rE   r_   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 numberrB   z-`partial_guess` column entries must be uniquerE   rE   )_range_matrixr   r   r   r   rF   r   r`   rU   r   r   rX   _rms     rM   r   z'Test2opt.test_specific_input_validation  sC   ]]HJ !QQ(,*93q!9)EGJ ]]"IK AAt{{(-1*=>K ]]"IK AAt{{("))..Aq*ABK ]]"IK AAt{{("}Q/B*BCK ]]HJ !AAt{{(!mAq.A*ABJ ]]EG !AAt{{("''&/:G GIJ JK KK KK KJ JG GsM   A	KAK=A!KAK*3AK7%ALKKK'*K47L LN)r~   r   r   r`   r   r   r   r   rO   rM   r   r      s    F) .&-rO   r   c                       e Zd Zd Zd Zy)TestQAPOncec                 B    t         j                  j                  d       y rS   rT   rW   s    rM   rY   zTestQAPOnce.setup_methodI  rZ   rO   c                 R	   t        j                  t        d      5  t        t        j
                  j                  d      t        j
                  j                  d             d d d        t        j                  t        d      5  t        t        j
                  j                  d      t        j
                  j                  d             d d d        t        j                  t        d      5  t        t        j
                  j                  d      t        j
                  j                  d             d d d        t        j                  t        d      5  t        t        j
                  j                  d      t        j
                  j                  d	             d d d        t        }t        j                  t        d
      5  t        t	        j                  d      t	        j                  d      d |dd      i       d d d        t        j                  t        d      5  t        t	        j                  d      t	        j                  d      dt        dd      i       d d d        t        j                  t        d      5  t        t	        j                  d      t	        j                  d      dt        j
                  j                  ddd      i       d d d        t        j                  t        d      5  t        t	        j                  d      t	        j                  d      ddt        dd      z  i       d d d        t        j                  t        d      5  t        t	        j                  d      t	        j                  d      ddt        dd      z  i       d d d        t        j                  t        d      5  t        t	        j                  d      t	        j                  d      dt	        j                  d      i       d d d        y # 1 sw Y   xY w# 1 sw Y   kxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   WxY w# 1 sw Y    xY w# 1 sw Y   xY w# 1 sw Y   :xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nz`A` must be squarer   )rA   rB   r   z`B` must be squarez!`A` and `B` must have exactly two)rA   rA   rA   z*`A` and `B` matrices must be of equal size)rB   rB   z.`partial_match` can have only as many seeds asrA   rp   r2   rE   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 numberrB   z-`partial_match` column entries must be uniquer   )
r   r   r   r   rF   rU   r   r   r   r   r   s     rM   test_common_input_validationz(TestQAPOnce.test_common_input_validationM  sb   ]]:-AB 		  (		  ( C
 ]]:-AB 		  (		  ( C ]]"EG 		  +		  +G ]]BD !		  (		  (D ]]FH !QQ*93q!9)EGH ]]"IK AA(-1*=>K ]]"IK AA("))..Aq*ABK ]]"IK AA("}Q/B*BCK ]]HJ !AA(!mAq.A*ABJ ]]EG !AA("''&/:G G} CB
 CBG GD DH HK KK KK KJ JG Gs   AP)AP60AQAQ
>Q+AQ*AQ7AR/ARA
R)P36Q QQQ'*Q47RRRR&N)r~   r   r   rY   r   r   rO   rM   r   r   H  s    FrO   r   c                     t        j                  | |f      }t        |      D ]  }t        j                  |       |d d |f<     |S )N)rF   zerosrangert   )abmatis       rM   r   r     s<    
((Aq6
C1XIIaLAqD	 JrO   c                    d}d| j                  d      z  }d| |z  z  }| }t        |      D ]  }t        j                  |j                  d      dz
        |k  j	                         r<t        j                  |j                  d      dz
        |k  j	                         r |S d|| z  z  }d| |z  z  }|d d d f   | z  |z  } |S )Ni  r   r   )axis)sumr   rF   absall)Pr   max_itercrP_epsits          rM   r   r     s     H	AEEqEMA	QUAEHoVVEII1I%)*S0557		q	)A-.499; L	 QKQK!T'
Q"  LrO   )gMbP?)r   numpyrF   scipy.optimizer   r   scipy.optimize._qapr   rq   numpy.testingr   r   r   rN   rQ   r   r   r   r   r   r   rO   rM   <module>r      s_      @ 5 = ="Jv) v)rEn EPS~ SlK K\rO   