
    h$,f              
       `   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	 d dl
mZ d dlmZ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mZ d d
lmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ej`                  jc                  de*e+z   e,z   e.z         d        Z2d Z3d Z4ej`                  jc                  dejj                  ejl                  ejn                  ejp                  f      d        Z9ej`                  jc                  dejj                  ejl                  ejn                  ejp                  f      d        Z:ej`                  jc                  dd      d        Z;ej`                  jc                  dg d      d        Z<ej`                  jc                  dejn                  ejp                  f      ej`                  jc                  de,      d               Z=d Z>d Z?d Z@d ZAej`                  jc                  de-e.z         d        ZBd  ZCej`                  jc                  d!d"d#g      d$        ZDd% ZEd& ZFej`                  jc                  d'g d(      ej`                  jc                  d)g d(      ej`                  jc                  dg d*      ej`                  jc                  d+ eGd,            d-                             ZHd. ZIej`                  jc                  d/ ej                  g d0ejj                  1       ej                  d2d,gejl                  1      g ej                  ejl                        f ej                  g d0ejj                  1       ej                  d2d,gejp                  1      g ej                  ejp                        f ej                  g d0ejj                  1       ej                  d3d4geL1      g ej                  eL      fg      d5        ZMd6 ZN ej                         d7        ZPej`                  jc                  dejn                  ejp                  g      d8        ZQej`                  jc                  d9g d:      ej`                  jc                  d;g d<      ej`                  jc                  d=g d>      d?                      ZRej`                  jc                  dejn                  ejp                  g      d@        ZSdA ZTdB ZUedC        ZVdD ZWdE ZXdF ZYdG ZZej`                  jc                  dHej                  ge,dIge,D  cg c]  } | j                   c} z   J      ej`                  jc                  dKej                  ge,dIge,D  cg c]  } | j                   c} z   J      dL               Z\ej`                  jc                  de,      dM        Z]ej`                  jc                  dNej                  ge,dIge,D  cg c]  } | j                   c} z   J      dO        Z^ej`                  jc                  dPdQdRg      dS        Z_yc c} w c c} w c c} w )T    N)linalgsparse)eigh)eigsh)expit)make_low_rank_matrixmake_sparse_spd_matrix)gen_batches)_init_arpack_v0)assert_allcloseassert_allclose_dense_sparseassert_almost_equalassert_array_almost_equalassert_array_equalskip_if_32bit)_deterministic_vector_sign_flip_incremental_mean_and_var_randomized_eigsh_safe_accumulator_op	cartesiandensitylog_logisticrandomized_svd	row_normssafe_sparse_dotsoftmaxstable_cumsumsvd_flipweighted_mode)COO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSDOK_CONTAINERSLIL_CONTAINERS_modesparse_containerc                     t         j                  j                  d      }|j                  dd      }d|d<   d|d<   t	         | |            t	        |      k(  sJ y )Nr   
   r(      size)      )r*      )nprandomRandomStaterandintr   )r&   rngXs      @lib/python3.12/site-packages/sklearn/utils/tests/test_extmath.pytest_densityr7   2   sY    
 ))


"CBW%AAdGAdG#A&'71:555    c                  $   t         j                  j                  d      } | j                  dd      }t        j                  |j
                        }dD ]:  }t        ||      \  }}t        |||      \  }}t        ||       t        ||       < y )Nr   r(   r)   r+   )Nr   r-   axis)	r0   r1   r2   r3   onesshaper%   r   r   )r4   xweightsr;   modescoremode2score2s           r6   test_uniform_weightsrD   ?   s~    
))


"CBW%AggaggG *Atne%at<v4'5&)*r8   c                  |   d} t         j                  j                  d      }|j                  | d      }|j	                  |j
                        }| |d d d df<   |d d d dfxx   dz  cc<   t        ||d      \  }}t        ||        t        |j                         |d d d df   j                  d             y )N   r   d   r(   r+   r*   r-   r:   )r0   r1   r2   r3   random_sampler=   r   r   r   ravelsum)mode_resultr4   r>   wr@   rA   s         r6   test_random_weightsrN   M   s     K
))


"CKi0A!''"AAa!eHa!eHMH11-KD%t[)ekkmQq"1"uX\\!_=r8   dtypec           
         d}d}d}d}| t         j                  k(  rdnd}t        j                  |       } t        |||dd      j	                  | d	
      }|j
                  ||fk(  sJ t        j                  |d	      \  }}}	|j	                  | d	
      }|j	                  | d	
      }|	j	                  | d	
      }	dD ]  }
t        |||
d      \  }}}| j                  dk(  r3|j                  | k(  sJ |j                  | k(  sJ |j                  | k(  s_J |j                  t         j                  k(  sJ |j                  t         j                  k(  sJ |j                  t         j                  k(  sJ |j
                  ||fk(  sJ |j
                  |fk(  sJ |j
                  ||fk(  sJ t        |d | ||       t        t        j                  |d d d |f   |	d |d d f         t        j                  ||      |       t        D ]  } ||      }t        |||
d      \  }}}| j                  dk(  r3|j                  | k(  sJ |j                  | k(  sJ |j                  | k(  sSJ |j                  j                  dk(  sJ |j                  j                  dk(  sJ |j                  j                  dk(  sJ t        |d | |d | |         y )NrH     r*   r(              r   	n_samples
n_featureseffective_ranktail_strengthrandom_stateFcopyfull_matrices)autoLUQRpower_iteration_normalizerrY   fdecimal)r0   float32rO   r   astyper=   r   svdr   kindfloat64r   dotr"   )rO   rU   rV   rankkre   r5   UsVt
normalizerUasaVacsr_containers                  r6   'test_randomized_svd_low_rank_all_dtypesrv   _   s    IJD
ABJJ&aAGHHUOE 		 fUf  77y*---- zz!51HAq" 	
U#A	U#A	5u	%B* 0F
#qZa

B ::88u$$$88u$$$88u$$$88rzz)))88rzz)))88rzz)))xxIq>)))xxA4xxAz?*** 	AbqE2w7 	FF1QU8RAY'B	

 , 	FMa A (1!JBB zzS xx5(((xx5(((xx5(((xx}}+++xx}}+++xx}}+++%4"Ud)WE!	FA0Fr8   c                 0   t         j                  j                  d      }t        j                  t        j                  g d|             }t         j
                  j                  |j                  |j                              d   }||z  |j                  z  }t        |dd      \  }}|j                  d	k(  sJ t        |d
dg       |j                  dk(  sJ t        j                  t              5  t        |dd       ddd       y# 1 sw Y   yxY w)z@Test that `_randomized_eigsh` returns the appropriate components*   )      ?       rS         @rO   r+   r   r.   module)n_components	selection)r.   r{   rz   )   r.   valueN)r0   r1   r2   diagarrayr   qrnormalr=   Tr   r   pytestraisesNotImplementedError)rO   r4   r5   rand_roteigvalseigvecss         r6   test_randomized_eigshr      s     ))


#C
.e<=Ayy||CJJAGGJ45a8H1xzz!A )hOGW==D   gT{3==F""" 
*	+ @!!w?@ @ @s   4DDrm   )r(   2   rH         c           	      (   d}t        |d      }t        || ddd      \  }}t        || ddddd	      \  }}t        ||| z
  |d
z
  f      \  }}|j                         ddd   }	||	   }|dd|	f   }|j                  | fk(  sJ t        ||d       t        ||d       |j                  || fk(  sJ t        j                  |      j                  }
t        ||
      \  }}t        ||
      \  }}t        ||
      \  }}t        ||d       t        ||d       | |k  rqt        |d      }t        || ddd|      \  }}|j                         ddd   }	||	   }t        ||d       |dd|	f   }t        ||
      \  }}t        ||d       yy)a&  Check that `_randomized_eigsh` is similar to other `eigsh`

    Tests that for a random PSD matrix, `_randomized_eigsh` provides results
    comparable to LAPACK (scipy.linalg.eigh) and ARPACK
    (scipy.sparse.linalg.eigsh).

    Note: some versions of ARPACK do not support k=n_features.
    r   r   )rY   r}      )r~   r   n_iterrY      r`   )r~   r   n_oversamplesrY   rb   r   r-   )subset_by_indexNrF   rd   r   LA)whichtolmaxiterv0r(      )r	   r   r   argsortr=   r   r0   
zeros_liker   r   r   r   )rm   rV   r5   r   r   
eigvals_qr
eigvecs_qreigvals_lapackeigvecs_lapackindices
dummy_vecs_r   eigvals_arpackeigvecs_arpacks                  r6   (test_randomized_eigsh_compared_to_othersr      s    Jz:A )	XbqGW /	#'J
 &*	JNJN;&"NN $$&tt,G#G,N#AwJ/N A4'''g~qAj.!D J?222w'))J':.JGQZ4MJ <NAg~qAj.!D 	:~Za8).q!Tb*
& !((*4R40'0!.."M'7
3$^Z@!..!L r8   zn,rank))r(   rR   rG   )rH   P   )rQ   r(   )rQ      )rQ   i  c                 <   || k  sJ t         j                  j                  d      }|j                  | |      }||j                  z  }t        |||      \  }}t        t         j                  j                  |d      t        j                  |j                               t        |j                  |z  t        j                  t        j                  |j                                     |t        j                  |      z  |j                  z  }t        ||d       y)a  Check that randomized_eigsh is able to reconstruct a low rank psd matrix

    Tests that the decomposition provided by `_randomized_eigsh` leads to
    orthonormal eigenvectors, and that a low rank PSD matrix can be effectively
    reconstructed with good accuracy using it.
    E   )r~   rY   r   r:   rF   rd   N)r0   r1   r2   randnr   r   r   r   normr<   r=   r   )nrl   r4   r5   ASVA_reconstructs           r6   &test_randomized_eigsh_reconst_low_rankr     s    $ !8O8 ))


#C		!TA	ACCA QTDDAqbiinnQQn79IJaccAgrwwrwwqww/?'@A
NQSS(M mQ:r8   ru   c                 Z   t         j                  j                  d      j                  dd      }| t         j                  u rd}nd}|j                  | d      }|dz  j                  d	      }t        |t        |d
      |       t        t        j                  |      t        |      |       t         j                  t         j                  fD ]  } |||       }|t         j                  u rD|j                  j                  |d      |_        |j                  j                  |d      |_        |j                  j                  |k(  sJ |j                  j                  |k(  sJ t        |t        |d
      |       t        t        j                  |      t        |      |        y )Nrx   rH   r   r*   FrZ   r.   r-   r:   T)squaredr|   )r0   r1   r2   r   rf   rg   rK   r   r   sqrtint32int64indptrr   rO   )rO   ru   r5   	precisionsq_normcsr_index_dtypeXcsrs          r6   test_row_normsr   3  sW    			b!''S1A

			U#A!tjjaj GgyD'A9Mbggg.	!iHHHbhh/ 
PQe, bhh&++,,_5,IDK<<..U.KDL||!!_444{{  O333!'9T4+H)T!"'''"2IdOYO
Pr8   c                  j   d} d}d}d}t        | ||dd      }|j                  | |fk(  sJ t        j                  |d	      \  }}}d
D ]h  }t	        ||d|d      \  }}}t        j                  |d | |z
        j                         dkD  sJ t	        |||d      \  }}	}t        |d | |	d       j y )NrH   rQ   r*   r(   皙?r   rT   Fr\   r^   noner_   r`   r   rb   rY   g{Gz?ra   r/   rd   	r   r=   r   rh   r   r0   absmaxr   
rU   rV   rl   rm   r5   r   ro   rq   rs   saps
             r6   'test_randomized_svd_low_rank_with_noiser   O  s    IJD
A 		A 77y*---- jj%0GAq!2 3
 "qzPQ
2q
 vvaebj!%%'$... #qZa
	3
 	AbqE32#3r8   c                  l   d} d}d}d}t        | ||dd      }|j                  | |fk(  sJ t        j                  |d	      \  }}}d
D ]i  }t	        ||d|d      \  }}}t        j                  |d | |z
        j                         dkD  sJ t	        ||d|d      \  }}	}t        |d | |	d       k y )NrH   rQ   r*   r(   ry   r   rT   Fr\   r   r   r   r/   rd   r   r   s
             r6   !test_randomized_svd_infinite_rankr   x  s    IJD
A 		A 77y*---- jj%0GAq!2 3
 "qzPQ
2q
 vvaebj!%%'#--- #qzPQ
	3 	AbqE32%3r8   c            
         d} d}d}d}t        | ||dd      }|j                  | |fk(  sJ t        ||dd	d
      \  }}}t        ||ddd
      \  }}	}
t        ||ddd
      \  }}}t        j                  |d	      \  }}}t        ||d | d       t        |	|d | d       t        ||d | d       t        t        j                  ||      t        j                  |d d d |f   |d |d d f         d       t        t        j                  ||
      t        j                  |d d d |f   |d |d d f         d       t        |	|       y )NrH   rQ   r   r(   g      ?r   rT   r/   F)r   	transposerY   Tr^   r\   rd   r.   )r   r=   r   r   rh   r   r0   rk   )rU   rV   rl   rm   r5   U1s1V1U2s2V2U3s3V3U4s4V4s                    r6   )test_randomized_svd_transpose_consistencyr     sZ   IJD
A	A 77y*----1Q%aPJBB1Q$QOJBB1Q&qQJBBAU3JBBBrFA.BrFA.BrFA.r2r!RaR%y"RaRU)(DaPr2r!RaR%y"RaRU)(DaP Br8   c            	      D   t         j                  j                  d      } t        ddd|       }|d| j	                  dd|j
                  	      z  z  }d}t        ||dd
d      \  }}}||j                  t        j                  |      j                  |            z
  }t        j                  |d      }t        ||dd
d      \  }}}||j                  t        j                  |      j                  |            z
  }t        j                  |d      }t        j                  ||z
        dkD  sJ dD ]  }	t        ||d|	d      \  }}}||j                  t        j                  |      j                  |            z
  }t        j                  |d      }dD ]  }
t        |||
|	d      \  }}}||j                  t        j                  |      j                  |            z
  }t        j                  |d      }dt        j                  ||z
        kD  rJ   y )Nrx   rH   rQ   r   rW   rY   r/   r   r.   r+   r   r   fro)ordr   )r_   r`   r^   )r*   r(   r      )r0   r1   r2   r   r3   r=   r   rk   r   r   r   r   )r4   r5   r~   rn   ro   rp   r   error_2error_20rq   ierrors               r6   .test_randomized_svd_power_iteration_normalizerr     s    ))


#CS#bsKAS[[AAGG[,	,,AL 	<fSTHAq" 	
AEE"''!*..$%%Akk!'G	<vTUHAq" 	
AEE"''!*..$%%A{{1%(H66'H$%+++* 0
!'1
1b bggajnnR())++aU+ 
	0A%+5HAq" AEE"''!*..,--AKKu-Ew////
	00r8   c                 <   t         j                  j                  d      }t        ddd|      }d} | |      }dj	                  | j
                        }t        j                  t        j                  |      5  t        ||d	d
       d d d        y # 1 sw Y   y xY w)Nrx   r   r   r(   r   r*   zCCalculating SVD of a {} is expensive. csr_matrix is more efficient.matchr-   r   )r   rb   )r0   r1   r2   r   format__name__r   warnsr   SparseEfficiencyWarningr   )r&   r4   r5   r~   warn_msgs        r6   #test_randomized_svd_sparse_warningsr     s     ))


#CRBSIALAMTT%%	
 
 
f44H	E Uq,qVTU U Us   9BBc                     t         j                  j                  d      } d}d}| j                  ||      }t	        j
                  |d      \  }}}t        ||d      \  }}t        t        j                  ||z  |      |d       |j                  }	t	        j
                  |	d      \  }}}t        ||d	      \  }
}t        t        j                  |
|z  |      |	d       t        ||d	      \  }}t        t        j                  ||z  |      |	d       t        ||d      \  }}t        t        j                  ||z  |      |	d       y )
N  r   r(   Fr\   u_based_decisionrF   rd   T)
r0   r1   r2   r   r   rh   r   r   rk   r   )rsrU   rV   r5   rn   r   rp   r   r   XTr   r   U_flip1V_flip1U_flip2V_flip2s                   r6   test_svd_flipr     s!   			t	$BIJ
J'A zz!51HAq"ae4FBrAvr*Aq9 
Bzz"E2HAq"ad3FBrAvr*B:  2=GWw{G4b!D2>GWw{G4b!Dr8   zn_samples, n_features)r/   r   )r   r/   c                 p   t         j                  j                  |      }|j                  | |      }t	        j
                  |d      \  }}}t        ||d      \  }}t        j                  t        j                  |      d      }	||	t        j                  |j                  d         f   dk\  j                         sJ t        ||d      \  }}
t        j                  t        j                  |
      d      }|
t        j                  |
j                  d         |f   dk\  j                         sJ y )NFr\   Tr   r   r:   r-   )r0   r1   r2   r   r   rh   r   argmaxr   aranger=   all)rU   rV   global_random_seedr   r5   rn   r   rp   r   max_abs_U1_row_idx_for_colr   max_abs_V2_col_idx_for_rows               r6   test_svd_flip_max_abs_colsr    s    			1	2B
J'Azz!51HAq"QT2EB!#266":A!>)299RXXa[+AABaGLLNNNQU3EAr!#266":A!>ryy!%'AABaGLLNNNr8   c                     t        j                  ddgddgg      } t        | ddd      \  }}}t        d      D ]  }t        | dd|      \  }}}t	        ||       t	        ||       t	        t        j
                  ||z  |      |        t	        t        j
                  |j                  |      t        j                  d             t	        t        j
                  |j                  |      t        j                  d              y )	Ng       @rS   ry   r.   T)   	flip_signrY   r(   )r0   r   r   ranger   rk   r   eye)au1r   v1seedu2r   v2s           r6   test_randomized_svd_sign_flipr  '  s    
3*sCj)*A12FJBBb	 9#AqDtL
BB#B#BFF27B/3BFF244,bffQi8BFF244,bffQi89r8   c                      d } t        j                  d      j                  dd      }t        |ddd      \  }}} | ||      \  }}|sJ |rJ t        |dddd	      \  }}} | ||      \  }}|sJ |rJ y )
Nc                 "   t        j                  |       j                  d      | j                  d      k(  j                         }t        j                  |      j                  d      |j                  d      k(  j                         }||fS )z
        returns bool tuple indicating if the values maximising np.abs
        are positive across all rows for u and across all columns for v.
        r   r:   r-   )r0   r   r   r   )uvu_basedv_baseds       r6   max_loading_is_positivezMtest_randomized_svd_sign_flip_with_transpose.<locals>.max_loading_is_positive8  so    
 66!9==a=(AEEqEM9>>@66!9==a=(AEEqEM9>>@r8   r   r(   r   r/   Tr   r  )r  r   rY   )r0   r   reshaper   )	r  mat	u_flippedr   	v_flippedr  r  u_flipped_with_transposev_flipped_with_transposes	            r6   ,test_randomized_svd_sign_flip_with_transposer  3  s    
  ))F

#
#B
+C -S!tRSTIq).y)DGWN7; =KQ$$Q=9a!9 / ":GW N7;wr8   r   )r   rH   ,  m)r(   r   r   r  r*   c                    t         j                  j                  |      }|j                  | |      }t	        ||dd      \  }}}t	        ||dd      \  }	}
}|j
                  |	j
                  k(  sJ t        ||	dd       |j
                  |
j
                  k(  sJ t        ||
dd       |j
                  |j
                  k(  sJ t        ||dd       y )Ngesddr   )svd_lapack_driverrY   gesvdgMbP?)atolrtol)r0   r1   r2   randr   r=   r   )r   r  rm   r  r4   r5   r
  r   vt1r  r   vt2s               r6   !test_randomized_svd_lapack_driverr)  T  s     ))


%CAA !AqQKBC AqQKBC 88rxxB.88rxxB.99		!!!C140r8   c                     t        j                  g d      t        j                  ddg      t        j                  ddg      f} t        j                  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        ||       t        j                  d      }t        |d d t         j
                  f   t        |f             y )Nr-   r.   r/   r   r*   rF   rR   )r-   r   rF   )r-   r   rR   )r-   r*   rF   )r-   r*   rR   )r.   r   rF   )r.   r   rR   )r.   r*   rF   )r.   r*   rR   )r/   r   rF   )r/   r   rR   )r/   r*   rF   )r/   r*   rR   r/   )r0   r   r   r   r   newaxis)axestrue_outoutr>   s       r6   test_cartesianr0  n  s     HHY1a&!1288QF3CDDxx	
H" D/Cx% 			!AqBJJ'A49r8   zarrays, output_dtyper+  r|   r   r>   yc                 <    t        |       }|j                  |k(  sJ y)z8Check that the cartesian product works with mixed types.N)r   rO   )arraysoutput_dtypeoutputs      r6   test_cartesian_mix_typesr6    s     & vF<<<'''r8   c                     d } t        j                  ddd      }d}t        j                  t        |      5  t        t        |       | |             d d d        t        j                  ddg      }t        j                  t        |      5  t        t        |      d	d
g       d d d        y # 1 sw Y   \xY w# 1 sw Y   y xY w)Nc                 >    t        j                  t        |             S )N)r0   logr   )r>   s    r6   naive_log_logisticz1test_logistic_sigmoid.<locals>.naive_log_logistic  s    vveAhr8   r.   r   z0`log_logistic` is deprecated and will be removedr   g      Yg      Y@ir   )r0   linspacer   r   FutureWarningr   r   r   )r:  r>   r   	extreme_xs       r6   test_logistic_sigmoidr?    s      	B2AAH	m8	4 J!,q/3Ea3HIJ &%)I	m8	4 F!,y"9D!9EF F	J JF Fs   B/B;/B8;Cc                  @    t         j                  j                  d      S )Nrx   )r0   r1   r2    r8   r6   r4   r4     s    99  $$r8   c                 \   d}| j                  dd      j                  |      |z  }| j                  |j                  d         |z  }t        |ddd|      \  }}}t	        j
                  ||d      }t	        j
                  |dz  |d      |dz  z
  }	t        ||       t        ||	       y )Nr(     r   r   sample_weightr?   r;   r.   )r&  rg   r=   r   r0   averager   )
r4   rO   multr5   rE  meanvarr   expected_meanexpected_vars
             r6   2test_incremental_weighted_mean_and_variance_simplerM    s    Dr!!%(4/AHHQWWQZ(4/M,Q1a}ULD#qJJq-a@M


1a4Q7-:JJ  m,\*r8   rI  )r       cAg    crJ  )r-   :0yE>g     j@zweight_loc, weight_scale))r   r-   )r   rO  )r-   rO  )r(   r-   )rN  r-   c                    d }d}|j                  |||d         }|j                  | ||      }t        t        j                  ||d      }	t        t        j                  ||	z
  dz  |d      }
 ||||	|
       |j                  | ||      }t        j                  |d         }t        t        j
                  |d      }	t        t        j                  |d      }
 ||||	|
       y )Nc           
          | j                   d   }d|dz  dz   |dz  dz   |dz  dz   |fD ]M  }d\  }}}t        ||      D ]  }	t        | |	   |||||	         \  }}} t        ||       t        ||d	       O y )
Nr   r-   r(   r   r.   )r   r   r   rD  ư>)r$  )r=   r
   r   r   )
r5   rE  rK  rL  r   
chunk_size	last_meanlast_weight_sumlast_varbatchs
             r6   _assertz<test_incremental_weighted_mean_and_variance.<locals>._assert  s    GGAJa2gk16A:qAvz1E 	?J3:0I$Q
3 7PeH#"/"684	8_ I}5Hl>	?r8   )rH   r   r   )locscaler,   rF  r.   r:   )r   r   r0   rG  r<   rI  rJ  )rI  rJ  
weight_locweight_scaler4   rX  r,   weightr5   rK  rL  ones_weights               r6   +test_incremental_weighted_mean_and_variancer_    s    ? DZZJlaZIF 	

t3T
2A(QQOM'


Q&1,f1L Av}l3 	

t3T
2A''$q'"K(!!<M':LA{M<8r8   c           	         t        j                  g d      }t        j                  g d      }t        j                  g dt         j                        }t        j                  d      }t        j                  d      }t        j                  g dg dg d	g      j	                  |       }t        j                  d
t         j
                  d
d
gt         j
                  d
ddgddt         j
                  dgdddt         j
                  gg      j	                  |       }t        |||||      \  }}	}
t        |||||      \  }}}t        ||       t        ||	       t        ||
       y )N     @rb  rb  rb       @rd  rd  rd  r.   r.   r.   r.   r|   r/   r      rg  rg  rg    ri  ri  ri  r  r  r  r  rg  ri  r  rD  )r0   r   r   r<   rg   nanr   r   )rO   	old_meansold_variancesold_weight_sumsample_weights_Xsample_weights_X_nanr5   X_nanX_meansX_variancesX_countX_nan_meansX_nan_variancesX_nan_counts                 r6   6test_incremental_weighted_mean_and_variance_ignore_nanrx    s;   56IHH=>MXXl"((;Nwwqz771:
	35IJ	fUm  HH"&&#s#VVS#s##rvvs##sBFF#		
 fUm 
 %>	9m^CS%!G[' 1J*1-K+ K)O[1K)r8   c                     t        j                  g dg dg dg dg      j                  } d}| d |d d f   }| |d d d f   }|j                  d      }|j	                  d      }t        j
                  |j                  d   |j                  d   t         j                        }t        ||||      \  }}}	t        || j                  d      d       t        || j	                  d      d       t        |	| j                  d          y )N)iX  i  rg  ri  r  r.   r   r:   r-   r|   rF   )
r0   r   r   rI  rJ  fullr=   r   r   r   )
r   idxX1X2rl  rm  old_sample_countfinal_meansfinal_variancesfinal_counts
             r6   )test_incremental_variance_update_formulasr    s     	%%%%		
	 a  C	
4C47B	
347BQIFFFNMwwrxx{BHHQKrxxH0I
I}&61-K+ QVVV^Q7A:QWWQZ0r8   c            	      <   t        j                  g d      } t        j                  g d      }t        j                  g dt         j                        }t        j                  g dg dg dg      }t        j                  dt         j                  ddgt         j                  dd	d	gd	d	t         j                  d
gd
d
d
t         j                  gg      }t	        || ||      \  }}}t	        || ||      \  }}	}
t        ||       t        |	|       t        |
|       y )Nra  rc  re  r|   rf  rh  rj  rg  ri  r  )r0   r   r   rk  r   r   )rl  rm  r~  r5   rq  rr  rs  rt  ru  rv  rw  s              r6   -test_incremental_mean_and_variance_ignore_nanr  2  s    56IHH=>MxxBHH=
&(<>RSTAHH"&&#s#VVS#s##rvvs##sBFF#		
E %>	9m%5%!G[' 1Jy-)91-K+ K)O[1K)r8   c                     d } d }d }d }d}d}d}t        j                  dt         j                  	      }t        j                  d
t         j                  	      }t        j                  |dz  |f|t         j                  	      }	t        j                  |dz  |f|t         j                  	      }
t        j
                  |	|
f      }t        j                   | |       ||      z
        j                         |kD  sJ |	dd d f   t        j                  |      |dz  }}}t        |
j                  d         D ]  } ||
|d d f   |||      \  }}} ||j                  d   k(  sJ t        j                  |j                  d      |z
        j                         dkD  sJ t        j                   | |      |z
        j                         |kD  sJ |	dd d f   t        j                  |      }}t        j                  ||dz  t         j                  	      }t        |
j                  d         D ]9  }t        |
|d d f   j                  d|
j                  d   f      |||      \  }}}; t        ||j                  d          t!        |j                  d      |       |t        j                   | |      |z
        j                         kD  sJ y )Nc                 &    | j                  d      S )Nr   r:   )rJ  )r   s    r6   np_varz=test_incremental_variance_numerical_stability.<locals>.np_varR  s    uu!u}r8   c                     | j                   d   }| dz  j                  d      |z  }| j                  d      |z  dz  }||z
  S )Nr   r.   r:   )r=   rK   )r5   r   exp_x2expx_2s       r6   one_pass_varzCtest_incremental_variance_numerical_stability.<locals>.one_pass_varW  sK    GGAJQ$#a'%%Q%-!#)r8   c                     | j                  d      }| j                         }t        j                   ||z
  dz  d      S )Nr   r:   r.   )rI  r[   r0   )r5   rI  Ys      r6   two_pass_varzCtest_incremental_variance_numerical_stability.<locals>.two_pass_var`  s5    vv1v~FFHwwDQQ//r8   c                 p    |dz   }|t        |      z  }| |z  ||z  z   }||z  | |z
  | |z
  z  |z  z   }|||fS )Nr-   )float)r>   rT  last_variancelast_sample_countupdated_sample_countsamples_ratioupdated_meanupdated_variances           r6   naive_mean_variance_updatezQtest_incremental_variance_numerical_stability.<locals>.naive_mean_variance_updateh  sm    014)E2F,GG//)m2KKM)9}\!125IIJ 	 -/CCCr8   r   r.   i'  g    חAr|   gh㈵>r   r:   rR  r-   )r0   r   rj   r9  rz  vstackr   r   zerosr  r=   rI  r   r   r  r   r   )r  r  r  r  r   rV   rU   x1x2A0A1r   rI  rJ  r   r   s                   r6   -test_incremental_variance_numerical_stabilityr  N  su   
0D CJI	#RZZ	(B	BJJ	'B	)q.*-r	DB	)q.*-r	DB
		2r(A 66&)l1o-.224s:::
 ad8RXXj19>q#D288A; J1"QT(D#qIc1J
??66!&&a&.4'(,,.55566&)c/"&&(3... 1a4"((:.#D

IN"((;A288A; 
0q!tHa!-.c1
c1
 q!''!*%aff!fnd3q	C(,,....r8   c                  v   t         j                  j                  d      } | j                  dd      }|j                  \  }}dD ]s  }t        j
                  d|j                  d   |      }|d   |j                  d   k7  rt        j                  ||g      }t        |d d |dd        D ]
  \  }}|||d d f   }|dk(  rt|j                  d      }	|j                  d      }
|j                  d   }t        j                  |j                  d   |j                  d   t         j                  	      }n&t        |	
      }|\  }	}
}||j                  d   z  }t        j                  |d | d      }t        j                  |d | d      }t        |	|d
       t        |
|d
       t        ||        v y )Nr   r   r(   )   r   %   r   r   r-   r:   r|   rF   )r0   r1   r2   r   r=   r   hstackziprI  rJ  rz  r   r   r   r   )r4   r5   rU   rV   
batch_sizestepsr   jrW  incremental_meansincremental_variancesincremental_countsample_countresultcalculated_meanscalculated_variancess                   r6   test_incremental_variance_ddofr    s   
))


%C		"bAGGIz" @
		!QWWQZ49
"IIui01Ecr
E!"I. 	@DAqac1fIEAv$)JJAJ$6!(-		q	(9%$)KKN!!wwu{{1~u{{1~RXXV2,.C\ QWM"$9;LA.!wwq!u15#%66!BQ%a#8  13CQG 57KQO0,?'	@@r8   c                     t         j                  j                  d      j                  dd      } t        j                  t        j
                  |       d      }t        |       }t        j                  |d      }t        ||       t        j                  | t        | j                  d         |f         }t        | ||d d t         j                  f   z         y )N$   r*   r-   r:   r   )r0   r1   r2   r   r   r   r   r   signr  r=   r,  )datamax_abs_rowsdata_flippedmax_rowssignss        r6   test_vector_sign_flipr    s    99  $**1a0D99RVVD\2L248LyyA.H|X.GGDtzz!}-|;<=Et\E!RZZ-,@@Ar8   c                     t         j                  j                  d      } | j                  dd      }t        j                  |      }t        j
                  |d      j                  d      }t        t        |      ||z         y )Nr   r/   r*   r-   r:   )r   r-   )	r0   r1   r2   r   exprK   r  r   r   )r4   r5   exp_X	sum_exp_Xs       r6   test_softmaxr    s`    
))


"C		!QAFF1IEu1%--g6Igaj%)*;<r8   c                     t        t        g d      t        j                  g d             t        j                  j                  d      j                  d      } t        j                  t              5  t        | dd       d d d        t        j                  j                  d      j                  dd      }t        t        |d	      t        j                  |d	             t        t        |d
	      t        j                  |d
	             t        t        |d	      t        j                  |d	             y # 1 sw Y   xY w)Nr+  r   i )r%  r$  r  rC  )r*   r*   r*   r+   r:   r-   r.   )r   r   r0   cumsumr1   r2   r&  r   r   RuntimeWarningr3   )rr   s     r6   test_stable_cumsumr    s    }Y/91EF
		a %%f-A	n	% )aaa() 			b!))$Y)?A}QQ/111EF}QQ/111EF}QQ/111EF) )s   4E  E	A_containerdense)idsB_containerc                    t         j                  j                  d      }|j                  d      }|j                  d      }t        j                  ||      } | |      } ||      }t        ||d      }t        ||       y )Nr      r(   )r(   r   Tdense_outputr0   r1   r2   rI   rk   r   r   )r  r  r4   r   Bexpectedactuals          r6   test_safe_sparse_dot_2dr    sq     ))


"C(#A(#Avva|HAAAAQ5FFH%r8   c                    t         j                  j                  d      }|j                  d      }|j                  d      }t        j                  ||      } | |      }t        ||      }t        ||       |j                  d      }|j                  d      }t        j                  ||      } | |      }t        ||      }t        ||       y )Nr   )r.   r/   r   r*   rF   )rF   rR   )r.   r/   )r   r*   r/   rF   r  )ru   r4   r   r  r  r  s         r6   test_safe_sparse_dot_ndr    s    
))


"C 	/*A&!Avva|HaAQ"FFH% 	&!A,'Avva|HaAQ"FFH%r8   	containerc                 x   t         j                  j                  d      }|j                  d      }|j                  d      }t        j                  ||      }t         | |      |      }t        ||       |j                  d      }t        j                  ||      }t        | | |            }t        ||       y )Nr   r(   r  )r(   r  r  )r  r4   r  r   r  r  s         r6   test_safe_sparse_dot_2d_1dr    s     ))


"C2A 	(#Avva|HYq\1-FFH% 	(#Avva|HQ	!-FFH%r8   r  TFc                 V   t         j                  j                  d      }t        j                  ddd|      }t        j                  ddd|      }|j	                  |      }t        |||       }t        j                  |      |  k(  sJ | r|j                         }t        ||       y )Nr   r  r(   r   )r   rY   r   r  )	r0   r1   r2   r   rk   r   issparsetoarrayr   )r  r4   r   r  r  r  s         r6   !test_safe_sparse_dot_dense_outputr    s    
))


"Cb"c<Ab"c<AuuQxHQ=F??6"<'7888##% 2r8   )`numpyr0   r   scipyr   r   scipy.linalgr   scipy.sparse.linalgr   scipy.specialr   sklearn.datasetsr   r	   sklearn.utilsr
   sklearn.utils._arpackr   sklearn.utils._testingr   r   r   r   r   r   sklearn.utils.extmathr   r   r   r   r   r   r   r   r   r   r   r   r   r   sklearn.utils.fixesr    r!   r"   r#   r$   r%   markparametrizer7   rD   rN   r   r   rf   rj   rv   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r)  r0  r   rO   objectr6  r?  fixturer4   rM  r_  rx  r  r  r  r  r  r  r  r   r  r  r  r  )r  s   0r6   <module>r     s        %  I % 1       ^#n4~E6	6*>$ 288RXXrzz2::"NOLF PLF^ 288RXXrzz2::"NO@ P@, 56DM 7DMN 
;
;4 2::rzz":;.9P : <P4&3R&3R @*0Z +^n-LMU NU E2 0662BCO DO	9B n-n-l+q*1 + , . .1,:<  RXXirxx0("((Aq62RSBHHRXX	

 RXXirxx0("((Aq62TUBHHRZZ 	

 RXXirxx0("((C:V2TUBHHV	
"(#"(F % % 2::rzz":;+ <+ 0/ Q#9 0 1
#9L 2::rzz":;!* <!*H14*8 E/ E/P@@B=
G XX		HIY''HH  
 XX		HIY''HH  
&& .9& :&( XX		HIY''HH  
&
&" $73 83C I
 IP Is    X!&X&X+