
    Q3jG                        d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZ d dlmZmZmZmZ d dlmZmZmZmZ d dlmZ d dlmZmZmZmZ d d	lm Z  ejB                  jE                  d       Z#e#jI                  d
      Z%e#jI                  d
      Z&e%e%jO                  d      ddejP                  f   z  Z%e&e&jO                  d      ddejP                  f   z  Z&de%jR                  _*        de&jR                  _*        ejV                  jY                  dg d      ejV                  jY                  dg d      ejV                  jY                  dd dg      d                      Z-ejV                  jY                  de       ejV                  jY                  dddg      ejV                  jY                  dg d      ejV                  jY                  dd dg      d                             Z.d Z/ejV                  jY                  de       d        Z0ejV                  jY                  dg d      ejV                  jY                  d  e1dd!            d"               Z2ejV                  jY                  dg d      d#        Z3d$ Z4d% Z5d& Z6d' Z7d( Z8d) Z9d* Z:d+ Z;ejV                  jY                  de       d,        Z<d- Z=ejV                  jY                  d. e             ejV                  jY                  d/ e> e             e/d0gz         ejV                  jY                  d1d2d3g      d4                      Z?d5 Z@d6 ZAd7 ZBd8 ZCd9 ZDd: ZEejV                  jY                  d;eeee
g      d<        ZFd= ZGy)>    N)config_context)make_classification)AdditiveChi2SamplerNystroemPolynomialCountSketch
RBFSamplerSkewedChi2Sampler)chi2_kernelkernel_metricspolynomial_kernel
rbf_kernel)_atol_for_typeget_namespace_and_devicemove_to)yield_namespace_device_dtype_combinationsdevice)_array_api_for_testsassert_allcloseassert_array_almost_equalassert_array_equal)CSR_CONTAINERS),  2   size   axisFgamma)皙?r         @zdegree, n_components))r     )   r#   )   i  coef0r"   c                    t        t        t        | ||      }t        || ||d      }|j	                  t              }|j                  t              }t        j                  ||j                        }||z
  }	t        j                  t        j                  |	            dk  sJ t        j                  |	|	       t        j                  |	      dk  sJ t        j                  |	      dk  sJ y )N)r    degreer&   *   )n_componentsr    r&   r(   random_state皙?outr!   )r   XYr   fit_transform	transformnpdotTabsmeanmax)
r    r(   r&   r*   kernelps_transformX_transY_transkernel_approxerrors
             T/DATA/.local/lib/python3.12/site-packages/sklearn/tests/test_kernel_approximation.pytest_polynomial_count_sketchr@   3   s     q!5uMF )!L ((+G$$Q'GFF7GII.M]"E66"''%.!T)))FF5e66%=C775>T!!!    csr_containerr!         ?r(   )r   r$   r%   c                 4   t        d| ||d      }|j                  t              }|j                  t              }t        d| ||d      }|j                   |t                    }|j                   |t                    }	t        ||       t        ||	       y)zZCheck that PolynomialCountSketch results are the same for dense and sparse
    input.
    r#   r)   )r*   r    r(   r&   r+   N)r   r1   r/   r2   r0   r   )
r    r(   r&   rB   ps_denseXt_denseYt_dense	ps_sparse	Xt_sparse	Yt_sparses
             r?   )test_polynomial_count_sketch_dense_sparserK   P   s     %fEPRH %%a(H!!!$H%fEPRI ''a(89I##M!$45IHi(Hi(rA   c                     | |z  S )N )xys     r?   _linear_kernelrP   h   s    q5LrA   c                 F   t         d d t        j                  d d f   j                         }t        t        j                  d d d d f   j                         }d|z  |z  ||z   z  }|j                  d      }t        d      }|j                  t               }|j                  t              }t        j                  ||j                        }t        ||d       |j                   | t                     }	|j                   | t                    }
t        ||	j                                t        ||
j                                t        j                         }d|d<   d}t        j                  t         |	      5  |j#                  |       d d d        y # 1 sw Y   y xY w)
Nr$   r   r%   sample_stepsr   r   r   z!Negative values in data passed tomatch)r/   r3   newaxiscopyr0   sumr   r1   r2   r4   r5   r   r   toarraypytestraises
ValueErrorfit)rB   X_Y_large_kernelr9   r2   r;   r<   r=   
X_sp_trans
Y_sp_transY_negmsgs                r?   test_additive_chi2_samplerrg   l   sH    
1bjj!		!	!	#B	
2::q!		!	!	#Br6B;"r'*L 1%F $3I%%a(G!!!$GFF7GII.MfmQ7((q)9:J$$]1%56Jw
 2 2 45w
 2 2 45 FFHEE$K
-C	z	-e 
.	-	-s   <FF method)r_   r1   r2   rS      c                     t        |      } t        ||       t               d}t        ||      } t        ||       t               |j                  |k(  sJ y)zsCheck that the input sample step doesn't raise an error
    and that sample interval doesn't change after fit.
    rR   g      ?)rS   sample_intervalN)r   getattrr/   rk   )rh   rS   transformerrk   s       r?   'test_additive_chi2_sampler_sample_stepsrn      s[     &<@K GK #O%!'K !GK #&&/999rA   c                     t        d      }t        j                  d      }t        j                  t
        |      5   t        ||       t               ddd       y# 1 sw Y   yxY w)z8Check that we raise a ValueError on invalid sample_stepsri   rR   zHIf sample_steps is not in [1, 2, 3], you need to provide sample_intervalrV   N)r   reescaper\   r]   r^   rl   r/   )rh   rm   rf   s      r?   -test_additive_chi2_sampler_wrong_sample_stepsrr      sL     &15K
))RC 
z	-$V$Q' 
.	-	-s   AA&c                     d} t         j                         }|  dz  |d<   t        | z   d d t        j                  d d f   }|| z   t        j                  d d d d f   }t        j
                  |      dz  t        j
                  |      dz  z   t        j
                  d      z   t        j
                  ||z         z
  }t        j                  |j                  d            }t        | dd      }|j                  t              }|j                  |      }t        j                  ||j                        }	t        ||	d	       t        j                  |      j                         sJ d
       t        j                  |	      j                         sJ d       |j                         }
|  dz  |
d<   d}t!        j"                  t$        |      5  |j                  |
       d d d        y # 1 sw Y   y xY w)NgQ?g       @rU   r$   r     r)   )
skewednessr*   r+   r   zNaNs found in the Gram matrixz)NaNs found in the approximate Gram matrixz2X may not contain entries smaller than -skewednessrV   )r0   rY   r/   r3   rX   logexprZ   r	   r1   r2   r4   r5   r   isfiniteallr\   r]   r^   )cra   X_cY_c
log_kernelr9   r2   r;   r<   r=   re   rf   s               r?   test_skewed_chi2_samplerr~      s    	A 
BrCxBtH q5!RZZ"
#C62::q!#
$C
 
s	rvvc{S01BFF3K?"&&sBSS  VVJNNN*+F "QTPRSI%%a(G!!"%GFF7GII.MfmQ7;;v""$E&EE$;;}%))+X-XX+ GGIE"s(E$K
>C	z	-E" 
.	-	-s   G))G2c                  x   t               } t        j                         }d|d<   t        j                  t
        d      5  | j                  |       ddd       t        j                  t
        d      5  | j                  t               | j                  |       ddd       y# 1 sw Y   TxY w# 1 sw Y   yxY w)zEnsures correct error messagerT   rU   zX in AdditiveChi2SamplerrV   N)r   r/   rY   r\   r]   r^   r_   r2   )rm   X_negs     r?   %test_additive_chi2_sampler_exceptionsr      s    %'KFFHEE$K	z)C	D 
E	z)C	De$ 
E	D 
E	D	D	Ds   B$4'B0$B-0B9c                     d} t        t        t        |       }t        | dd      }|j	                  t              }|j                  t              }t        j                  ||j                        }||z
  }t        j                  t        j                  |            dk  sJ t        j                  ||       t        j                  |      dk  sJ t        j                  |      d	k  sJ y )
Ng      $@r    rt   r)   )r    r*   r+   g{Gz?r-   r!   r,   )r   r/   r0   r   r1   r2   r3   r4   r5   r6   r7   r8   )r    r9   rbf_transformr;   r<   r=   r>   s          r?   test_rbf_samplerr      s     E1E*F UBOM))!,G%%a(GFF7GII.M]"E66"''%.!T)))FF5e66%=C775>T!!!rA   c                     t               }t        j                  ddgddgddgg|       }|j                  |       |j                  j
                  | k(  sJ |j                  j
                  | k(  sJ y	zRCheck that the fitted attributes are stored accordingly to the
    data type of X.r   r$   r%   ri         dtypeN)r   r3   arrayr_   random_offset_r   random_weights_)global_dtyperbfr/   s      r?   (test_rbf_sampler_fitted_attributes_dtyper      sm     ,C
1a&1a&1a&)>AGGAJ##|333$$444rA   c                     t        d      } t        j                  ddgddgddggt        j                  	      }| j	                  |       t        d      }t        j                  ddgddgddggt        j
                  	      }|j	                  |       t        | j                  |j                         t        | j                  |j                         y
z?Check the equivalence of the results with 32 and 64 bits input.r)   )r+   r   r$   r%   ri   r   r   r   N)	r   r3   r   float32r_   float64r   r   r   )rbf32X32rbf64X64s       r?   "test_rbf_sampler_dtype_equivalencer     s    B'E
((QFQFQF+2::
>C	IIcNB'E
((QFQFQF+2::
>C	IIcNE((%*>*>?E))5+@+@ArA   c                      dgdggddg}} t        d      }|j                  | |       |j                  t        j                  d      k(  sJ y)	z4Check the inner value computed when `gamma='scale'`.g        rC   r   r   scaler   ri   N)r   r_   _gammar\   approx)r/   rO   r   s      r?   test_rbf_sampler_gamma_scaler     sI    EC5>Aq6qA
7
#CGGAqM::q))))rA   c                     t               }t        j                  ddgddgddgg|       }|j                  |       |j                  j
                  | k(  sJ |j                  j
                  | k(  sJ yr   )r	   r3   r   r_   r   r   r   )r   skewed_chi2_samplerr/   s      r?   0test_skewed_chi2_sampler_fitted_attributes_dtyper     sr     ,-
1a&1a&1a&)>AA--33|CCC..44DDDrA   c                     t        d      } t        j                  ddgddgddggt        j                  	      }| j	                  |       t        d      }t        j                  ddgddgddggt        j
                  	      }|j	                  |       t        | j                  |j                         t        | j                  |j                         y
r   )	r	   r3   r   r   r_   r   r   r   r   )skewed_chi2_sampler_32X_32skewed_chi2_sampler_64X_64s       r?   *test_skewed_chi2_sampler_dtype_equivalencer   &  s    .B?88aVaVaV,BJJ?Dt$.B?88aVaVaV,BJJ?Dt$--/E/T/T ..0F0V0VrA   c                 j   ddgddgddgg}t               j                  |      j                  |       t               j                  |      j                  |       t	               j                  |      j                  |        | |      }t	               j                  |      j                  |       y )Nr   r$   r%   ri   r   r   )r   r_   r2   r	   r   )rB   r/   s     r?   test_input_validationr   8  s     Q!Q!Q Aa **1-A((+LQ!!!$aALQ!!!$rA   c                     t         j                  j                  d      } | j                  d      }t	        |j
                  d         j                  |      }t        |      }t        t        j                  ||j                        |       t	        d|       }|j                  |      j                  |      }|j
                  |j
                  d   dfk(  sJ t	        dt        |       }|j                  |      j                  |      }|j
                  |j
                  d   dfk(  sJ t               }|D ]P  }t	        d||       }|j                  |      j                  |      }|j
                  |j
                  d   dfk(  rPJ  y )Nr   
   ri   r   r*   r$   r*   r+   r*   r9   r+   )r3   randomRandomStateuniformr   shaper1   r   r   r4   r5   r_   r2   rP   r   )rndr/   X_transformedKtranskernels_availablekerns          r?   test_nystroem_approximationr   E  sN   
))


"C!A !''!*5CCAFM1Abff]MOODaH!#6EIIaL**1-M1771:q/111 !NMEIIaL**1-M1771:q/111 '(!a3G		!..q1""qwwqz1o555 "rA   z(array_namespace, device_name, dtype_namer9   precomputedr*   r$   d   c                 h   t        | ||      \  }}t        j                  j                  d      }d}d|z  }	|j	                  ||	f      j                  |      }
|dk(  rt        |
d |       }
|j                  |
|      }t        ||d      }|j                  |
      }t        d	      5  |j                  |      }t        |t        d
      }dD ]1  }t        t        ||            \  }}}||u sJ |t        |      k(  r1J  	 d d d        t        |      }t!        ||       y # 1 sw Y   #xY w)Nr   r   r$   r   r   r   r   T)array_api_dispatchcpu)xpr   )components_normalization_)atol)r   r3   r   r   r   astyper   asarrayr   r1   r   r   r   rl   array_devicer   r   )array_namespacedevice_name
dtype_namer9   r*   r   r   r   	n_samples
n_featuresX_npX_xpnystroemX_np_transformedX_xp_transformedX_xp_transformed_npattribute_namexp_attr_device_attrr   s                        r?   %test_nystroem_approximation_array_apir   `  s<    &o{JOJB
))


"CI YJ;;Y
3;4;;JGD$}-.::d6:*D\&qQH--d3	4	0#11$7%&62eL?N&>.1'#GQ b= =,t"4444 @	 
1 *%D$&9E 
1	0s   +AD(D((D1c                     t         j                  j                  d      } | j                  d      }t	        d      }|j                  |      }t        |d       }t        j                  ||j                        }t        ||       t	        dd      }|j                  |      }t        |d	      }t        j                  ||j                        }t        ||       y )
Nr)   r   r   r   r   r   chi2r9   r*   r   )r3   r   r   r   r   r1   r   r4   r5   r   r
   )r   r/   r   r   r   K2s         r?    test_nystroem_default_parametersr     s    
))


#C!A R(H**1-M1D!A	}	/Ba$ vB7H**1-MAQA	}	/Ba$rA   c                     t         j                  j                  d      } | j                  dd      }t        j                  |gdz        }d}t        ||j                  d         j                  |      }|j                  |      }t        ||      }t        |t        j                  ||j                               t        j                  t        j                  t                    sJ y )Nr   r      r$   r   )r    r*   r   )r3   r   r   randvstackr   r   r_   r2   r   r   r4   r5   ry   rx   r0   )rngr/   r    Nr   r   s         r?   test_nystroem_singular_kernelr     s    
))


"CRA
		1#'AEu1771:6::1=AKKNM1E"Aa}!GH66"++a.!!!rA   c                  0   t         j                  j                  d      } | j                  d      }t	        |dd      }t        d|j                  d   dd	      }|j                  |      }t        t        j                  ||j                        |       y )
N%   r   r   g@r!   r(   r&   
polynomialr   )r9   r*   r(   r&   )r3   r   r   r   r   r   r   r1   r   r4   r5   )r   r/   r   r   r   s        r?    test_nystroem_poly_kernel_paramsr     sz    
))


#C!A!Cs3A!''!*SH **1-Mbff]MOODaHrA   c                     t         j                  j                  d      } d}| j                  |df      }d }g }t	        |      }t        ||dz
  d|i      j                  |       t        |      ||dz
  z  d	z  k(  sJ d
}ddiddidd	if}|D ]L  }t        dt        |dz
  d|}t        j                  t        |      5  |j                  |       d d d        N y # 1 sw Y   YxY w)Nr)   r   ri   r   c                 l    |j                  d       t        j                  | |      j                         S )z&Histogram kernel that writes to a log.r   )appendr3   minimumrZ   )rN   rO   rv   s      r?   logging_histogram_kernelz8test_nystroem_callable.<locals>.logging_histogram_kernel  s'    

1zz!Q##%%rA   r   rv   )r9   r*   kernel_paramsr$   -Don't pass gamma, coef0 or degree to Nystroemr    r&   r(   r   rV   rM   )r3   r   r   r   listr   r_   lenrP   r\   r]   r^   )	r   r   r/   r   
kernel_logrf   paramsparamnys	            r?   test_nystroem_callabler     s    
))


#CI)Q(A&
 JQA'!mj) 
c!fz?i9q=9A==== :ClWaL8Q-8FS^9q=SUS]]:S1FF1I 21 11s   C  C)	c                     t         j                  j                  d      } | j                  d      }t	        |dd      }t        d|j                  d   	      }|j                  |      }t        t        j                  ||j                        |       d
}ddiddiddif}|D ]R  }t        dd|j                  d   d	|}t        j                  t        |      5  |j                  |       d d d        T y # 1 sw Y   _xY w)N   r   r   r$   r!   r   r   r   r   r   r    r   r&   r(   rV   rM   )r3   r   r   r   r   r   r   r1   r   r4   r5   r\   r]   r^   r_   )	r   r/   r   r   r   rf   r   r   r   s	            r?    test_nystroem_precomputed_kernelr     s     ))


#C!A!AS1A}1771:FH**1-Mbff]MOODaH :ClWaL8Q-8FM]MuM]]:S1FF1I 21 11s   C::D	c                      t        dd      \  } }t        dd      }|j                  |        |j                  j                  dk(  sJ y)	zCheck that `component_indices_` corresponds to the subset of
    training points used to construct the feature map.
    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/20474
    r   r   )r   r   r   r   r   )r   N)r   r   r_   component_indices_r   )r/   r   feature_map_nystroems      r?   test_nystroem_component_indicesr     sO     <DAq# Q2288EAAArA   	Estimatorc                 *    |        j                  t              }|j                  t              }|j                         }| j                  j                         }t        |j                  d         D cg c]  }| | 
 }}t        ||       yc c}w )zCheck get_feature_names_outr   N)	r_   r/   r2   get_feature_names_out__name__lowerranger   r   )r   estr;   	names_out
class_nameiexpected_namess          r?   test_get_feature_names_outr	    s    
 +//!
CmmAG))+I##))+J27a8H2IJ2IQQC(2INJy.1 Ks   4Bc                     t         j                  j                  d      } | j                  d      }t	        d      j                  |      }g d}g d}|j                  |      }|D cg c]  }d	| 	 }}t        ||       y
c c}w )z4Check get_feature_names_out for AdditiveChi2Sampler.r   )r   r%   r   r%   rR   )f0f1f2)f0_sqrtf1_sqrtf2_sqrtf0_cos1f1_cos1f2_cos1f0_sin1f1_sin1f2_sin1f0_cos2f1_cos2f2_cos2f0_sin2f1_sin2f2_sin2)input_featuresadditivechi2sampler_N)r3   r   r   random_sampler   r_   r   r   )r   r/   chi2_samplerinput_namessuffixesr  suffixr  s           r?   .test_additivechi2sampler_get_feature_names_outr$    s    
))


"Cx(A&A6::1=L$KH$ 22+2NIDLMH&,VH5HNMy.1 Ns   +B)Hrp   numpyr3   r\   sklearn._configr   sklearn.datasetsr   sklearn.kernel_approximationr   r   r   r   r	   sklearn.metrics.pairwiser
   r   r   r   sklearn.utils._array_apir   r   r   r   r   r   sklearn.utils._testingr   r   r   r   sklearn.utils.fixesr   r   r   r   r  r/   r0   rZ   rX   flags	writeablemarkparametrizer@   rK   rP   rg   r  rn   rr   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	  r$  rM   rA   r?   <module>r1     sw   	   * 0     / 	iiA9%9% QUUU]1bjj=! ! QUUU]1bjj=! !    -0/1PQ1c(+" , R 1"4 .93*-9-1c(+) , . . :)( .9! :!H #HIq!5: 6 J:  #HI( J(&#R	%"&
5B*
E$ .9	% :	%66 .-/ d>#$'FF !S2F 3	FB%(" 
I:(B '5FQ222rA   