
    ^MhJ                        d dl Z d dlZd dlmZ d dlmZ d dlZd dlm	Z	m
Z
mZmZ d dlZd dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ  d dl!m"Z"m#Z#m$Z$m%Z%m&Z& eej'        (                    d          gZ)ej'        j*        Z* ej+        g d          ,                    d          Z- ej+        ddgddgddgddgddgddgddgddgddgddgddgg          Z. ej+        ddgddgddgg          Z/ ej+        ddgddgd d!gg          Z0 ej+        g d"          Z1 G d# d$          Z2 G d% d&          Z3 e*d'(           G d) d*                      Z4dS )+    N)deepcopyLock)assert_array_equalassert_equalassert_suppress_warnings)raises)kmeanskmeans2py_vqvqwhitenClusterError
_krandinit)_vq)array_api_compatible)matrix)array_api_extra)SCIPY_ARRAY_APIarray_namespacexp_copyxp_assert_closexp_assert_equalskip_xp_backends(  ggQ?Gz
ףp=
?gRQ gQ@gQgffffff?333333g)\(@zG(\?gGzgQ
@RQgffffff@gQg
ףp=
ףp=
gQ@g      q=
ףp@皙gHzG@g
ףp=
g333333@gQgQ?\(\gQ@gGzzG@g=
ףp={Gz?g      皙@gQg      ?\(\g\(\	@QgQ?=
ףp=gHzGѿ(\ gr*   gq=
ףp?g(\gp=
ף@QgQ?g\(\ףp=
@gQg)\(@gp=
ף Q@g=
ףp=g(\@gQ gp=
ף?gq=
ףpgQ?      )\(?r0   g)\( @g=
ףp=r&   =
ףp= g\(\@gGzg333333?ףp=
g(\ҿr)   gGz	@gffffffgGz?gQgGz?(\r.   g(\gGz@gffffff(\?gQQgzG\(\@\(\g(\@皙g      @r$   (\?g)\(gQ@gp=
ףg=
ףp=?gp=
ף @g(\g(\?GzgQ@gQg\(\@gp=
ף
Q@{Gz gp=
ףg
@Qgffffff@zGg?
ףp=
?g=
ףp=Q?r>   gRQ?Qg)\(?gQg)\(@gRQgQ@r!   gQ@p=
ףgRQؿr9   gQ@
ףp=
g\(\?r@   g=
ףp=?q=
ףp      ?333333?r$   Q@r"   gHzG@g333333gףp=
@gGzg)\(@r8   g333333?r>   g\(\?gRQg(\ @r2   rK   gףp=
	rL   r;   g
ףp=
?gQg?Qg\(\@q=
ףpgq=
ףp@r$   g\(\g(\r?   g?g)\(gQ	@gGzg?g\(\gQ@ffffff      @r0   \(\?g=
ףp=
g
ףp=
@ףp=
r1   HzGgQ?Qg
ףp=
?r3   g(\?r   gףp=
rO   (\?g{Gzg@gRQgQ@gQrD   g
ףp=
Gz@gr(   g(\gHzG@gGz gGzp=
ףrW   g
ףp=
gp=
ףg      gQ@rU   gq=
ףp?rP   gGz@rT   g{Gz?gQۿgp=
ף?g\(\gHzG@g      g(\rB   r   gq=
ףpg333333?gzG r7   {GzQ? gQ{Gz=
ףp=@g)\(gp=
ף
@gQr&   gq=
ףpg
ףp=
r+   gHzG?(\g
ףp=
?gQ	g333333?rH   r'   g)\(gzG@gQg(\	@QrI   rA   gQ	@r^   g{Gz?rN   r:   r8   gffffff@r   gGz@r2   rQ   g(\g333333rE   gHzG?rJ   gffffff?gffffffgRQ?gQgq=
ףp?      g(\@r<   g{Gz@ggGz?gHzGgQr-   r5   g333333r=   gq=
ףpgffffff?g
ףp=
rQ   r,   gףp=
@g333333g\(\@gGzgףp=
?g\(\rZ   g)\(g
ףp=
@gr]   gffffff=
ףp=@gg?r4   g      @g      gGz@p=
ףr=   gGzr#   gHzGgGz?gףp=
rF   r\   g(\@gGz
rV   gQgGz@gGzgRQ@r   g
ףp=
?(\g{Gz?r[         ?Qra   gHzGgQ@rU   gGz?r"   g)\(̿re   g333333?gzGr7   gQg{Gz@RQg333333@rX   {Gz
@gzGg@g
ףp=
r/   g)\( gGz?rb   gQ?r6   g{Gz@rS   rf   r_   rZ   r<   g{GzĿg=
ףp=gQrM   gffffff?rY   rg   rU   g?gGzrR   rG   g(\?r   g\(\?rc   r    r%   rW   g(\gzG @      g      @      rj   	               g@      @g333333@rC   gUUUUUU@gUUUUUU@g      @g      @g      @rI   )r   ro   rj   rj   rj   rj   ro   rj   ro   ro   ro   c                       e Zd Zd Zej        d             Z edd          d             Zd Z	ej
                            ed          d	             Zd
S )
TestWhitenc                     |                     ddgddgddgddgd	d
gg          }|                     ddgddgddgddgddgg          }t          t          |          |d           d S )Ng&cJ^|Y@g`q@gս	@g}&?J?gUH~
@g?gK=E@gFMp?g|H@gH|?cw&?gbA|?D=?k2?'B?);"~?|d=?z?|?Ry?h㈵>rtol)asarrayr   r   )selfxpdesiredobss       [/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/scipy/cluster/tests/test_vq.pytest_whitenzTestWhiten.test_whitenU   s    **z:6'4'4'4'4	6 7 7 jj:z2%z2%z2%z2%z2	4 5 5
 	sW4888888    c                     t                      S Nr   r   s    r   whiten_lockzTestWhiten.whiten_lockc       vvr   	jax.numpy)jax arrays do not support item assignmentreasonc                    |                     g dg dg dg          }|                     g dg dg dg          }|5  t          j        d          5 }t          j        d	           t	          t          |          |d
           t          t          |          d           t          t          |d         j
        t                               d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )N)        rd   gJJ@)r   rd   g I 1?)r   rd   gKX@)r   rd   g/?)r   rd   g@?)r   rd   g?T)recordalwaysr   r   ro   )r   warningscatch_warningssimplefilterr   r   r   lenr   
issubclasscategoryRuntimeWarning)r   r   r   r   r   ws         r   test_whiten_zero_stdzTestWhiten.test_whiten_zero_stdg   s    **3333333335 6 6 jj.........0 1 1  	D 	D(555 D%h///sW4@@@@SVVQ'''
1R5>>BBCCCD D D D D D D D D D D D D D D	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Ds6   C7A>CC7C#	#C7&C#	'C77C;>C;c           	          |j         |j        |j         fD ]A}|                    d|gddgddgddgdd	gg          }t          t          t
          |           Bd S 
Nrv   rw   rx   ry   rz   r{   r|   r}   r~   )naninfr   assert_raises
ValueErrorr   r   r   	bad_valuer   s       r   test_whiten_not_finitez!TestWhiten.test_whiten_not_finite{   s    "&0 	3 	3I**z95):6):6):6):6	8 9 9C
 *fc2222	3 	3r   )`np.matrix` unsupported in array API modec           	          t           j        t           j        t           j         fD ];}t          d|gddgddgddgdd	gg          }t	          t
          t          |           <d S r   )npr   r   r   r   r   r   r   s       r   test_whiten_not_finite_matrixz(TestWhiten.test_whiten_not_finite_matrix   s~     "&0 	3 	3I:y1%z2%z2%z2%z2	4 5 5C
 *fc2222	3 	3r   N)__name__
__module____qualname__r   pytestfixturer   r   r   r   markskipifr   r    r   r   rt   rt   S   s        9 9 9 ^  ^ kHJ J JD DJ JD$3 3 3 [J  L L3 3L L3 3 3r   rt   c                      e Zd Z ed          d             Zej                            ed          d             Z	 edd          d	             Z
ej                            ed          d
             Z ed          d             Z edd          d             Z edd          d             Z ed          d             Z ed          d             ZdS )TestVqTcpu_onlyc                 `   t          j        t          d         gt          d         gt          d         gg          }t          |                    t                    |                    |                    d         }t          ||                    t          |j                  d           d S )Nr   ro   rj   dtypeFcheck_dtype)r   concatenateXr   r   r   LABEL1int64r   r   initclabel1s       r   
test_py_vqzTestVq.test_py_vq   s    111788rzz!}}bjj&7&788;

6
 B B$)	+ 	+ 	+ 	+ 	+ 	+r   r   r   c                    t          j        t          d         gt          d         gt          d         gg          }t          t	          t                    t	          |                    d         }t          |t                     d S Nr   ro   rj   )r   r   r   r   r   r   r   r   s       r   test_py_vq_matrixzTestVq.test_py_vq_matrix   sb     111788vayy&--00366*****r   z!`_vq` only supports NumPy backend)np_onlyr   c                    t          j        t          d         gt          d         gt          d         gg          }t          j        |                    t                    |                    |                    \  }}t          |t                     t	          |                    t                    |                    |                    \  }}d S r   )r   r   r   r   r   r   r   r   r   r   r   r   _s        r   test_vqzTestVq.test_vq   s    111788F2::a=="**U*;*;<<	66***"**Q--E!2!233111r   c                 x   t          j        t          d         gt          d         gt          d         gg          }t          j        t          t                    t          |                    \  }}t          |t                     t	          t          t                    t          |                    \  }}d S r   )r   r   r   r   r   r   r   r   r   s        r   test_vq_matrixzTestVq.test_vq_matrix   s     111788F6!99fUmm44	66***&))VE]]++111r   c                    t           d d df         }|d d         }t          j        ||          \  }}|                    |          }|                    |          }t	          |d d t
          j        f         |d d t
          j        f                   \  }}t          ||                    ||j                  d           t          ||                    |                     d S )Nr   rk   r   Fr   )	r   r   r   r   r   r   newaxisr   r   )r   r   datar   abtatbs           r   
test_vq_1dzTestVq.test_vq_1d   s     AwRaRvdE""1zz$

5!!tAAArzM*E!!!RZ-,@AABBJJqJ99uMMMMBJJqMM*****r   c                     |                     ddg|j                  }|                    |j                  }t	          t
          t          j        ||           d S )Nrd   g       @r   )r   float64astypefloat32r   	TypeErrorr   r   )r   r   r   r   s       r   test__vq_sametypezTestVq.test__vq_sametype   sL    JJSzJ44HHRZ  iA.....r   c                     |                     ddgt                    }t          t          t          j        ||           d S )Nro   rj   r   )r   intr   r   r   r   )r   r   r   s      r   test__vq_invalid_typezTestVq.test__vq_invalid_type   s7    JJ1vSJ))iA.....r   c                    t           j                            dd          }t           j                            dd          }t          j        ||          \  }}t          |                    |          |                    |                    \  }}t          ||                    |          d           t          ||                    ||j	                  d           |
                    t           j                  }|
                    t           j                  }t          j        ||          \  }}t          |                    |          |                    |                    \  }}t          ||                    ||j                  d           t          ||                    ||j	                  d           d S )N   rk   r   r   r   Fr   )r   randomrandr   r   r   r   r   r   r   r   r   r   r   r   r   	code_bookcodes0dis0codes1dis1s           r   test_vq_large_nfeatzTestVq.test_vq_large_nfeat   s|   INN2r""INN1b))	va++JJqMM2::i00
 
 	bjj..T::::

6
 B BPUVVVVHHRZ  $$RZ00	va++JJqMM2::i00
 
 	bjjRZj@@tLLLL

6
 B BPUVVVVVVr   c                    t           j                            dd          dz  }t           j                            dd          dz  }t          j        ||          \  }}t          |                    |          |                    |                    \  }}t          ||                    |          d           t          ||                    ||j	                  d	           d S )
N
   rn   i@B rj   r   r   r   Fr   )
r   r   r   r   r   r   r   r   r   r   r   s           r   test_vq_large_featureszTestVq.test_vq_large_features   s    INN2q!!G+INN1a((72	va++JJqMM2::i00
 
 	bjj..T::::

6
 B BPUVVVVVVr   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s       t$$$+ + %$+ [J  L L+ +L L+ d+NOOO4 4 PO4 [J  L L, ,L L, t$$$
+ 
+ %$
+ d+NOOO/ / PO/
 d+NOOO/ / PO/ t$$$W W %$W. t$$$
W 
W %$
W 
W 
Wr   r   Tr   c                   4   e Zd Zd Zd Zej                            ed          d             Z	d Z
d Zej                            ed          d             Zd	 Zd
 Zd Z edd          d             Zej        d             Zej                            ej        dk    d          d             Zd Zd Zd Z edd          d             Zej        j         edd          d                         Zd Z edd          d             ZdS )	TestKMeanc                 4   d}d}t           j                            |          }t           j                            |          }dt           j                            ||          z  d|z  z
  }dt           j                            ||          z  d|z  z   }t          j        |j        d         |j        d         z   |ft           j                  }||d |j        d         <   |||j        d         d <   t          |                    |          dd           d S )	Ni,  d   i'  i N  r   rj   ro   seed)r   r   randnemptyshaper   r   r   )	r   r   dnm1m2xyr   s	            r   test_large_featureszTestKMean.test_large_features   s     Y__QY__QBIOOAq)))EBJ6BIOOAq)))EBJ6xagaj0!4bjAA[agaj[QWQZ[[ 	rzz$++++++r   c                    t           j                            d          }t          j        t          d         gt          d         gt          d         gg          }t          |                    t                    |                    |          d|          d         }t          ||                    t                               d S Ni1  r   ro   rj   iterrng)	r   r   default_rngr   r   r   r   r   CODET2r   r   r  r   code1s        r   test_kmeans_simplezTestKMean.test_kmeans_simple  s    i##E**111788rzz!}}bjj&7&7aSIII!Lrzz&1122222r   r   r   c                 T   t           j                            d          }t          j        t          d         gt          d         gt          d         gg          }t          t          t                    t          |          d|          d         }t          |t                     d S r  )	r   r   r  r   r   r   r   r   r  r  s        r   test_kmeans_simple_matrixz#TestKMean.test_kmeans_simple_matrix  s~     i##E**111788vayy&--aSAAA!Dv&&&&&r   c                 x   |                     t                    }|                     ddgddgddgg          }t          ||           t                      5 }|                    t
          d           t          ||d	           d d d            n# 1 swxY w Y   t          t          t          ||d
	           d S )Ng5 g!{gL^ @g͛`d?g8}g?kzKOne of the clusters is empty. Re-run kmeans with a different initializationwarn)missingraise)	r   TESTDATA_2Dr   r	   filterUserWarningr   r   r   )r   r   r   initksups        r   test_kmeans_lost_clusterz"TestKMean.test_kmeans_lost_cluster  s   zz+&&

Z5'4(+68 9 9 	tU   	1CJJ{23 3 3 D%0000		1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	lGT5'JJJJJJs   .BBBc                    t           j                            d          }|                    t          j        t
          d         gt
          d         gt
          d         gg                    }t          r|j        gnt           j        t          g}|D ]}t           |t
                     ||          d|          d         }t           |t
                     ||          d|          d         }t          ||                    t                               t          ||                    t                               d S NNa r   ro   rj   r  )r   r   r  r   r   r   r   r   r   r   CODET1r  )r   r   r  r   arraystpr  code2s           r   test_kmeans2_simplezTestKMean.test_kmeans2_simple$  s   i##H--

2>AaD6AaD6AaD6*BCCDD!0J"*rz66J 	7 	7BBBqEE22e991#>>>qAEBBqEE22e991#>>>qAEE2::f#5#5666E2::f#5#56666	7 	7r   c                    t           j                            d          }|                    t          j        t
          d         gt
          d         gt
          d         gg                    }t          t          t
                    t          |          d|          d         }t          t          t
                    t          |          d|          d         }t          |t                     t          |t                     d S r  )r   r   r  r   r   r   r   r   r   r  r  )r   r   r  r   r  r  s         r   test_kmeans2_simple_matrixz$TestKMean.test_kmeans2_simple_matrix/  s     i##H--

2>AaD6AaD6AaD6*BCCDDq		6%==qcBBB1Eq		6%==qcBBB1Ev&&&v&&&&&r   c                     |                     t                    }|d d df         }|d d         }t          ||          }t          ||dd          d          t          ||d          d          d S )Nr   rk   r   ro   )r  r   rj   r  )r   r  r   r   )r   r   r   data1r   codes         r   test_kmeans2_rank1zTestKMean.test_kmeans2_rank1:  s    zz+&&QQQT
bqb	u$$$ 	t!!,,,Q//t!$$$Q''''r   c                 v    |                     t                    }|d d df         }t          |dd           d S )Nr   rj   ro   r"  )r   r  r   )r   r   r   r#  s       r   test_kmeans2_rank1_2zTestKMean.test_kmeans2_rank1_2E  s?    zz+&&QQQT
qq!!!!!!r   c                     |                     t                    }|                    |d          d dd d f         }t          |d           d S )Nr   r   r   rj   )r   r  reshaper   )r   r   r   s      r   test_kmeans2_high_dimzTestKMean.test_kmeans2_high_dimJ  sO     zz+&&zz$))#2#qqq&1ar   r   r   c                    t           j                            d          }|                    t                    }d}t          ||d|           t          |d d df         |d|           t          ||d|           t          |d d df         |d|           t                      5 }|                    d           t          ||d	|           t          |d d df         |d	|           d d d            d S # 1 swxY w Y   d S )
Nr  rk   pointsminitr  ro   ++z%One of the clusters is empty. Re-run.)messager   )r   r   r  r   r  r   r	   r  )r   r   r  r   kr  s         r   test_kmeans2_initzTestKMean.test_kmeans2_initQ  sa    i##H--zz+&&axS1111QQQT
AX37777at----QQQT
ATs3333    	<CJJFJGGGD!85555DAJs;;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<s   *AC>>DDc                     t                      S r   r   r   s    r   
krand_lockzTestKMean.krand_lockd  r   r   win32zFails with MemoryError in Wine.c                    |                     t                    }|                    |d          |                    |d          d dd d f         g}t          d          }t	          |          }|5  |D ]{}t
          j                            d          }t          ||||          }t          j
        |j        |          }	t          j
        |j        |          }
t          |	|
d           |	 d d d            d S # 1 swxY w Y   d S )	Nrh   r)  r   g    .A  r!  gI+?)atol)r   r  r*  r   r   r   r   r  r   xpxcovTr   )r   r   r5  r   datasr2  xp_testr  initorig_covinit_covs              r   test_krandinitzTestKMean.test_krandinith  sh    zz+&&D(++D(++CRCF35HH!$'' 	A 	A A Ai++D11!$388746g666746g666(@@@@@A	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	As   3A?D  DDc                 d    t          t          t          |                    g           d           d S )Nrj   )r   r   r   r   r   r   s     r   test_kmeans2_emptyzTestKMean.test_kmeans2_emptyx  s&    j'2::b>>1=====r   c                 d   t          t          t          |                    t                    d           t          t          t
          |                    t                    d           t          t          t
          |                    t                    |                    g                      d S )Nr   )r   r   r   r   r   r   rD  s     r   test_kmeans_0kzTestKMean.test_kmeans_0k|  sl    j&"**Q--;;;j'2::a==!<<<j'2::a=="**R..IIIIIr   c                 4   |                     g d|j                  }t          |dd          }t          |d         |                     dg|j                             t          |d         |                     d|j                  d	                    d S )
N)ro   rj   rk   rl   r   r   ro   g 7yAC)threshr   rr   g333333@r   r   r   r   r   )r   r   r   ress       r   test_kmeans_large_thresz!TestKMean.test_kmeans_large_thres  s    JJ'''rzJ::Q$'''A

B4rz
 B BCCCA

+=RZ
 P PQS TUUUUUr   c                    t           j                            d          }|                    ddgddgg|j                  }t          |                    t                    dd|	          \  }}t          ||           d S )
Nl   C.t gC:g>g#~j?g'1:	g-'@r   rj   r0  r.  )r   r   r  r   r   r   r  r   )r   r   r  prev_resrK  r   s         r   test_kmeans2_kpp_low_dimz"TestKMean.test_kmeans2_kpp_low_dim  s     i##$788::U3 )624;=:  G GK00!4SIIIQX&&&&&r   c           	         t           j                            d          }d}d}t          j        dt          j        |          z  dt          j        |          z  g          }t          j        |                    |d         t          j        |          |          |                    |d         t          j        |          |          g          }|                    |          }t          |d	d
|          \  }}t          |
                    |          |
                    |                    |                               d S )Nl   <DM]4r   r   rn   r   )sizero   rj   r0  r.  )r   r   r  vstackonesmultivariate_normaleyer   r   r   sign)	r   r   r  n_dimrR  centersr   rK  r   s	            r   test_kmeans2_kpp_high_dimz#TestKMean.test_kmeans2_kpp_high_dim  s   
 i##$566)Q/"'%..02 3 3 y##GAJuD#II##GAJuD#II
  
 zz$q#666Qbggbjj.A.A&B&BCCCCCr   c                 \   |                     g d|j                  }t          ||                     ddg                    }t          |d         |                     ddg|j                             t          |d         |                     d	|j                  d
                    d S )N)r   r   ro   ro      r   r`   gGz?r   gٿg       @ro   g?r   rJ  )r   r   r   rK  s       r   test_kmeans_diff_convergencez&TestKMean.test_kmeans_diff_convergence  s    jj---RZj@@S"**c4[1122A

D2;bj
 I IJJJA

+=RZ
 P PQS TUUUUUr   c                    dt           j                            d          t           j                            d          g}|D ]}t	          |          }t	          |          }|                    t                    }t          |d|          \  }}t          |d|          \  }	}t          ||	           dD ]>}
t          |d|
|          \  }}t          |d|
|          \  }	}t          ||	           ?d S )Nr8  rj   r   )r   r-  r0  )r/  r   )
r   r   RandomStater  r   r   r  r   r   r   )r   r   	seed_listr   seed1seed2r   res1r   res2r/  s              r   #test_kmeans_and_kmeans2_random_seedz-TestKMean.test_kmeans_and_kmeans2_random_seed  s   
 ")''--ry/D/DT/J/J
	  	, 	,DTNNETNNE::k**DT15111GD!T15111GD!D$'''3 , ,!$UCCCa!$UCCCad++++,	, 	,r   N)r   r   r   r   r	  r   r   r   r   r  r  r  r  r%  r'  r+  r   r3  r   r5  sysplatformrB  rE  rG  rL  rO  thread_unsaferZ  r^  rf  r   r   r   r   r      s       , , ,$3 3 3 [J  L L' 'L L'K K K 	7 	7 	7 [J  L L' 'L L'	( 	( 	(" " "
   kHJ J J< <J J<" ^  ^ [/@  B BA AB BA> > >J J JV V V kHJ J J' 'J J' [kHJ J JD DJ J D"V V V kHJ J J, ,J J, , ,r   r   )5r   rg  copyr   	threadingr   numpyr   numpy.testingr   r   r   r	   r   r
   r   scipy.cluster.vqr   r   r   r   r   r   r   scipy.clusterr   scipy.conftestr   scipy.sparse._sputilsr   
scipy._libr   r:  scipy._lib._array_apir   r   r   r   r   r   usefixtures
pytestmarkr   arrayr*  r  r   r  r  r   rt   r   r   r   r   r   <module>rw     sy    



                             * * * * * *8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8       / / / / / / ( ( ( ( ( ( - - - - - -              #FK$;$;<N$O$OP
;/ bh %
 %
 %
 % %J 78K R BHsAhAA!fq!fq!fq!f!fq!fq!fq!f. / / 
FF#F#F#% 
& 
& 
FE?F#F#% 
& 
& 
333	4	4:3 :3 :3 :3 :3 :3 :3 :3z\W \W \W \W \W \W \W \WB 4   P, P, P, P, P, P, P, ! P, P, P,r   