
    UgvG                        d dl Z d dl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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          Z* ej%        g d           Z+ G d! d"          Z, G d# d$          Z- e$d%&           G d' d(                      Z.dS ))    N)deepcopy)assert_array_equalassert_equalassert_suppress_warnings)raises)kmeanskmeans2py_vqvqwhitenClusterError
_krandinit)_vq)array_api_compatible)matrix)SCIPY_ARRAY_APIcopycov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?      )\(?r-   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ؿr6   gQ@
ףp=
g\(\?r=   g=
ףp=?q=
ףp      ?333333?r!   Q@r   gHzG@g333333gףp=
@gGzg)\(@r5   g333333?r;   g\(\?gRQg(\ @r/   rH   gףp=
	rI   r8   g
ףp=
?gQg?Qg\(\@q=
ףpgq=
ףp@r!   g\(\g(\r<   g?g)\(gQ	@gGzg?g\(\gQ@ffffff      @r-   \(\?g=
ףp=
g
ףp=
@ףp=
r.   HzGgQ?Qg
ףp=
?r0   g(\?r   gףp=
rL   (\?g{Gzg@gRQgQ@gQrA   g
ףp=
Gz@gr%   g(\gHzG@gGz gGzp=
ףrT   g
ףp=
gp=
ףg      gQ@rR   gq=
ףp?rM   gGz@rQ   g{Gz?gQۿgp=
ף?g\(\gHzG@g      g(\r?   r   gq=
ףpg333333?gzG r4   {GzQ? gQ{Gz=
ףp=@g)\(gp=
ף
@gQr#   gq=
ףpg
ףp=
r(   gHzG?(\g
ףp=
?gQ	g333333?rE   r$   g)\(gzG@gQg(\	@QrF   r>   gQ	@r[   g{Gz?rK   r7   r5   gffffff@r   gGz@r/   rN   g(\g333333rB   gHzG?rG   gffffff?gffffffgRQ?gQgq=
ףp?      g(\@r9   g{Gz@ggGz?gHzGgQr*   r2   g333333r:   gq=
ףpgffffff?g
ףp=
rN   r)   gףp=
@g333333g\(\@gGzgףp=
?g\(\rW   g)\(g
ףp=
@grZ   gffffff=
ףp=@gg?r1   g      @g      gGz@p=
ףr:   gGzr    gHzGgGz?gףp=
rC   rY   g(\@gGz
rS   gQgGz@gGzgRQ@r   g
ףp=
?(\g{Gz?rX         ?Qr^   gHzGgQ@rR   gGz?r   g)\(̿rb   g333333?gzGr4   gQg{Gz@RQg333333@rU   {Gz
@gzGg@g
ףp=
r,   g)\( gGz?r_   gQ?r3   g{Gz@rP   rc   r\   rW   r9   g{GzĿg=
ףp=gQrJ   gffffff?rV   rd   rR   g?gGzrO   rD   g(\?r   g\(\?r`   r   r"   rT   g(\gzG @      g      @      rg   	               g@      @g333333@r@   gUUUUUU@gUUUUUU@g      @g      @g      @rF   )r   rl   rg   rg   rg   rg   rl   rg   rl   rl   rl   c                       e Zd Zd Z eddg          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       Z/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/scipy/cluster/tests/test_vq.pytest_whitenzTestWhiten.test_whitenS   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    	jax.numpy)jax arrays do not support item assignment)reasonsc                    |                     g dg dg dg          }|                     g dg dg dg          }t          j        d          5 }t          j        d	           t	          t          |          |d
           t          t          |          d           t          t          |d         j
        t                               d d d            d S # 1 swxY w Y   d S )N)        ra   gJJ@)r   ra   g I 1?)r   ra   gKX@)r   ra   g/?)r   ra   g@?)r   ra   g?T)recordalwaysr|   r}   rl   )r   warningscatch_warningssimplefilterr   r   r   lenr   
issubclasscategoryRuntimeWarning)r   r   r   r   ws        r   test_whiten_zero_stdzTestWhiten.test_whiten_zero_stda   sV    **3333333335 6 6 jj.........0 1 1 $D111 	@Q!(+++F3KKt<<<<Q###Jqu~~>>???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s   A>C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 
Nrs   rt   ru   rv   rw   rx   ry   rz   r{   )naninfr   assert_raises
ValueErrorr   r   r   	bad_valuer   s       r   test_whiten_not_finitez!TestWhiten.test_whiten_not_finites   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 modereasonc           	          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   r   r   r   pytestmarkskipifr   r    r   r   rq   rq   Q   s        9 9 9 kJKM M M@ @M M@ 3 3 3 [J  L L3 3L L3 3 3r   rq   c                      e Zd Z ed          d             Zej                            ed          d             Z	 eddg          d	             Z
ej                            ed          d
             Z ed          d             Z eddg          d             Z eddg          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   rl   rg   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   rl   rg   )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   rh   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 )Nra   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 )Nrl   rg   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   rh   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
   rk   i@B rg   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-P,QRRR4 4 SR4 [J  L L, ,L L, t$$$
+ 
+ %$
+ d-P,QRRR/ / SR/
 d-P,QRRR/ / SR/ t$$$W W %$W. t$$$
W 
W %$
W 
W 
Wr   r   Tr   c                       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gd          d             Zej                            ej        dk    d          d             Zd Zd Zd Z eddgd          d             Z eddgd          d             Zd Z eddgd          d             ZdS )	TestKMeanc                 0   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 S )Ni,  d   i'  i N  r   rg   )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   rl   rg   iter)	r   r   seedr   r   r	   r   r   CODET2r   r   r   code1s       r   test_kmeans_simplezTestKMean.test_kmeans_simple   s    
	u111788rzz!}}bjj&7&7a@@@Crzz&1122222r   r   r   c                 R   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{     		u111788vayy&--a888;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 NiNa r   rl   rg   r   )r   r   r   r   r   r   r   r   r
   r   CODET1r   )r   r   r   arraystpr   code2s          r   test_kmeans2_simplezTestKMean.test_kmeans2_simple  s	   
	x   

2>AaD6AaD6AaD6*BCCDD!0J"*rz66J 	7 	7BBBqEE22e991555a8EBBqEE22e991555a8E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  s        r   test_kmeans2_simple_matrixz$TestKMean.test_kmeans2_simple_matrix&  s     		x   

2>AaD6AaD6AaD6*BCCDDq		6%==q999!<q		6%==q999!<v&&&v&&&&&r   c                     |                     t                    }|d d df         }|d d         }t          ||          }t          ||d          d          t          ||d          d          d S )Nr   rh   )r   rl   r   rg   )r   r  r   r
   )r   r   r   data1r   codes         r   test_kmeans2_rank1zTestKMean.test_kmeans2_rank11  s}    zz+&&QQQT
bqb	Eb!!!t!$$$Q''t!$$$Q''''r   c                 v    |                     t                    }|d d df         }t          |dd           d S )Nr   rg   rl   r   )r   r  r
   )r   r   r   r  s       r   test_kmeans2_rank1_2zTestKMean.test_kmeans2_rank1_2:  s?    zz+&&QQQT
qq!!!!!!r   c                     |                     t                    }|                    |d          d dd d f         }t          |d           d S )Nr   r   r   rg   )r   r  reshaper
   )r   r   r   s      r   test_kmeans2_high_dimzTestKMean.test_kmeans2_high_dim?  sO     zz+&&zz$))#2#qqq&1ar   r   r   T)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 )
Ni90  rh   pointsminitrl   ++z%One of the clusters is empty. Re-run.)messager   )r   r   r   r   r  r
   r   r  )r   r   r   kr	  s        r   test_kmeans2_initzTestKMean.test_kmeans2_initF  sT    		uzz+&&ax((((QQQT
AX....at$$$$QQQT
AT****    	3CJJFJGGGD!8,,,,DAJ2222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s   &AC88C<?C<win32zFails with MemoryError in Wine.c                    |                     t                    }|                    |d          |                    |d          d dd d f         g}t          d          }|D ]m}t          j                            d          }t          ||||          }t          |j	                  }t          |j	                  }t          ||d           nd S )Nre   r  r   g    .A  gI+?)atol)r   r  r  r   r   r   default_rngr   r   Tr   )	r   r   r   datasr$  rnginitorig_covinit_covs	            r   test_krandinitzTestKMean.test_krandinitZ  s     zz+&&D(++D(++CRCF35HH 	= 	=D)''--CdAsB//D46{{H46{{HHhV<<<<<	= 	=r   c                 d    t          t          t          |                    g           d           d S )Nrg   )r   r   r
   r   r   r   s     r   test_kmeans2_emptyzTestKMean.test_kmeans2_emptyh  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
   r3  s     r   test_kmeans_0kzTestKMean.test_kmeans_0kl  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)rl   rg   rh   ri   r   r   rl   g 7yAC)threshr   ro   g333333@r   r   r   r	   r   )r   r   r   ress       r   test_kmeans_large_thresz!TestKMean.test_kmeans_large_thresr  s    JJ'''rzJ::Q$'''A

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

+=RZ
 P PQS TUUUUUr   c                    |                     ddgddgg|j                  }t          j                            d           t          |                     t                    dd	          \  }}t          ||           d S )
NgC:g>g#~j?g'1:	g-'@r   *   rg   r"  r   )r   r   r   r   r   r
   r  r   )r   r   prev_resr:  r   s        r   test_kmeans2_kpp_low_dimz"TestKMean.test_kmeans2_kpp_low_dimy  s    
 ::U3 )624;=:  G G
	rK00!4@@@QX&&&&&r   c           	         d}d}t          j        dt          j        |          z  dt          j        |          z  g          }t           j                            d           t          j        t           j                            |d         t          j        |          |          t           j                            |d         t          j        |          |          g          }|                    |          }t          |d	d
          \  }}t          |
                    |          |
                    |                    |                               d S )Nr   r   rk   r=  r   )sizerl   rg   r"  r   )r   vstackonesr   r   multivariate_normaleyer   r
   r   sign)r   r   n_dimrB  centersr   r:  r   s           r   test_kmeans2_kpp_high_dimz#TestKMean.test_kmeans2_kpp_high_dim  s   
 )Q/"'%..02 3 3
	ryI))'!*bfUmm$)OOI))'!*bfUmm$)OO
  
 zz$q---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   rl   rl      r   r]   gGz?r   gٿg       @rl   g?r   r9  )r   r   r   r:  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 )Nr(  rg   )r   )r   r  r"  )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   r%  sysplatformr1  r4  r6  r;  r?  rJ  rN  rV  r   r   r   r   r      su       $ $ $"3 3 3 [J  L L' 'L L'K K K 	7 	7 	7 [J  L L' 'L L'( ( (" " "
   kJK#% % %3 3% %3" [/@  B B
= 
=B B
=> > >J J JV V V kJK#% % %' '% %' kJK#% % %D D% %D V V V kJK#% % %, ,% %, , ,r   r   )/r   rW  r   r   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._lib._array_apir   r   r   r   r   usefixtures
pytestmarkr   arrayr  r  r   r  r   r   rq   r   r   r   r   r   <module>rc     sU    



                       * * * * * *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43 43 43 43 43 43 43 43n\W \W \W \W \W \W \W \WB 4   I, I, I, I, I, I, I, ! I, I, I,r   