
    *YHhoE              
          d dl Z d dlm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 d dlmZ d dlmZ d dlmZmZmZ d d	lmZ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! d dl"m#Z# d dl$m%Z%m&Z&m'Z'm(Z(m)Z) d dl$m*Z+ 	 d dl,m-Z- dZ.ej`                  jc                  e. d      Z2 ejf                  g dg dg dg      Z4dZ5e4jl                  \  Z7Z8 ee5e4dd      \  Z9Z:d9dZ;ej`                  jy                  de%      d        Z=ej`                  jy                  d d!d" ej|                  d#e2$      g      ej`                  jy                  d%ej~                  ej                  g      d:d&              ZAej`                  jy                  d'dge'      ej`                  jy                  d d!d" ej|                  d#e2$      g      ej`                  jy                  d%ej~                  ej                  f      	 d;d(                     ZBd) ZCej`                  jy                  d'dge'      d;d*       ZDej`                  jc                  e. d      ej`                  jy                  d%ej~                  ej                  f      ej`                  jy                  de%      d;d+                     ZEej`                  jc                  e. d      ej`                  jy                  d%ej~                  ej                  f      d;d,              ZFd;d-ZGd;d.ZHd/ ZId0 ZJd1 ZKej`                  jy                  d d!d" ej|                  d#e2$      g      ej`                  jy                  d%ej~                  ej                  g      d2               ZLej`                  jc                  e.d3      d4        ZMej`                  jy                  d5g d6      ej`                  jy                  d7e'      d8               ZNy# e/$ r dZ.Y fw xY w)<    N)Mock)sparse)eigh)eigshlobpcg)KMeans)
make_blobs)SpectralEmbedding_spectral_embeddingspectral_embedding)_graph_connected_component_graph_is_connected)normalized_mutual_info_scorepairwise_distances
rbf_kernel)NearestNeighbors)assert_array_almost_equalassert_array_equal)_deterministic_vector_sign_flip)COO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSparse_version
sp_version)	laplacian)smoothed_aggregation_solverTFz1PyAMG is required for the tests in this function.)reason)              @r   r   r   )r   r   g      @r   r   )      ?r   r   r    r!     r!   *   )	n_samplescenterscluster_stdrandom_statec                     |dz  }t        | j                  |j                        D ]D  \  }}t        j                  ||z
  dz        |k  r%t        j                  ||z   dz        |k  rDJ  y)zLCheck array A and B are equal with possible sign flipping on
    each column   N)zipTnpmax)ABtoltol_squaredA_colB_cols         g/var/www/html/planif/env/lib/python3.12/site-packages/sklearn/manifold/tests/test_spectral_embedding.py _assert_equal_with_sign_flippingr5   8   sl     q&KACC 
uFFEEMa'(K7vvuu}*+{:	
;
    coo_containerc                    t         j                  j                  d      }d}dddd|g}|j                  |      }g }t	        j
                  |      D ]  \  }}||| }t        t        |      dz
        D ]  }	|j                  ||	   ||	dz      f         dt        |      dz
  }}
d}|j                  |
||      }|j                  |
||      }|j                  t        ||   ||                 t        t        j                  |      j                        \  }}|j                  d	dt        |            } | |||ff      }d
||j                  z   z  }t	        j
                  |      D ]a  \  }}t!        |||         }||z
  }|j#                         |k(  sJ t!        |||dz
           }|j#                         |k(  sJ t%        ||       c y )Nr#   i,  r   y         r"   )size皙?      ?)r,   randomRandomStatepermutation	itertoolspairwiserangelenappendrandintextendr*   tuplearrayr+   uniformr   sumr   )r7   rngr$   
boundariespconnectionsstartstopgroupimin_idxmax_idxn_random_connectionssourcetargetrow_idx
column_idxdataaffinitycomponent_1component_sizecomponent_2s                         r4   %test_sparse_graph_connected_componentra   C   s   
))


#CIRc9-J	"AK ))*5 >t% s5zA~& 	9Aa%A,78	9 c%j1n#Wg4HIWg4HI3uV}eFm<=>   5 7 78GZ;;sBS%5;6DdWj$9:;Hh+,H ))*5 	5t01U8D N222 11TAX;G N222;4	5r6   eigen_solverarpackr   amg)marksdtypec                 "   t         j                  j                  |      }d}t        j                  |dz  |dz  g      }t        j                  |j                  ||            dz   |d|d|f<   t        j                  |j                  ||            dz   ||d |d f<   t        |d      }|d | j                         sJ ||d  j                         rJ t        |d      }|d | j                         rJ ||d  j                         sJ d|d|dz   f<   d||dz   df<   d|j                  d d d|z  dz   <   d||j                  z   z  }t        j                  d|z        }d|d| t        ddt         j                  j                  |      | 	      }|j                  |j                  |            }	t        j                  |	j                         dk  t         j                   
      }
t#        ||
      t%        j&                  d      k(  sJ y )Nd   r)   shaper   r;   r>   precomputedn_componentsr]   r'   rb   rf   r!   )r,   r?   r@   zerosabsrandnr   allanyflatr+   r
   fit_transformastyperJ   ravelint64r   pytestapprox)rb   rf   seedr'   n_sampler]   	component
true_label
se_precompembedded_coordinatelabel_s              r4   &test_spectral_embedding_two_componentsr   o   s    99((.LHxxx!|X\:;H 	|!!(H56: QxZ8#$
 	|!!(H56: XZ#$
 +8Q7IYh##%%%#'')))*8R8I(#'')))XY##%%% !"HQ1_ !HX\1_)*HMM%Q\A%%&h+,HH-JJq"YY**40!	J %228??53IJXX)//1A5RXXFF'
F;v}}S?QQQQr6   sparse_containerc                    d}| t         n | t               }t        ddt        j                  j	                  |      |      }t        dd|t        j                  j	                  |      |      }|j                  t        |j                  |      |            }|j                  |j                  |            }	t        |j                  |j                         t        ||	d       y )	Nr!   r)   rl   rm   rbf)rn   r]   gammar'   rb   r   皙?)Sr
   r,   r?   r@   rv   r   rw   r   affinity_matrix_r5   )
r   rb   rf   r|   r   Xr   se_rbfembed_precomp	embed_rbfs
             r4   ,test_spectral_embedding_precomputed_affinityr      s     E%+;A+>A"YY**40!	J YY**40!F ,,Zu-UVM$$QXXe_5Ij996;R;RS$]ItDr6   c                  "   d} g }dD ]t  }t        | |z         j                  t              }|j                  t        d      }t	        ddd|       j                  |      j
                  }|j                  |       v t        |d   |d	          y )
Nr)   )r   
   )n_neighborsconnectivity)moder   precomputed_nearest_neighbors)r'   rn   r]   r   r;   )r   fitr   kneighbors_graphr
   
embedding_rF   r   )r   resultsadditional_neighborsnngraph	embeddings         r4   ,test_precomputed_nearest_neighbors_filteringr      s    KG ' "+8L*LMQQRST##AN#;8'	 SZZ 	 	y!" wqz71:.r6   c                    dt        t              }| t        n | t              }t        dfdt        j                  j                  |            }t        ddt        j                  j                  |            }|j                  |      }|j                  |      }t        |j                  |j                         t        ||j                         t        ||d       y )Ng?r   r)   c                     t        |       S )Nr   r   )xr   s    r4   <lambda>z;test_spectral_embedding_callable_affinity.<locals>.<lambda>   s    Jq6 r6   )rn   r]   r   r'   r   r   )
r   r   r
   r,   r?   r@   rv   r   r   r5   )	r   r|   kernr   se_callabler   r   embed_callabler   s	           @r4   )test_spectral_embedding_callable_affinityr      s     Eau%D%+;A+>A#6YY**40	K YY**40	F $$Q'I ..q1Nk::F<S<STdF$;$;<$YEr6   c           	      F   t        ddddt        j                  j                  |            }t        ddddt        j                  j                  |            }|j	                  t
        j                  |             }|j	                  t
        j                  |             }t        ||d       t        j                  g dt        j                  	      }t        j                  g d
t        j                  	      }t        j                  g dt        j                  	      }	 |t        j                  |	|	g      t        j                  ||g      t        j                  ||g      ffd      }
d|_        d|_        |j	                  |
j                  |             }|j	                  |
j                  |             }t        ||d       |
j                         }
|
j                  j                  t        j                        |
_        |
j                  j                  t        j                        |
_        t         t#        d      k\  }|r|j	                  |
       y d}t%        j&                  t(        |      5  |j	                  |
       d d d        y # 1 sw Y   y xY w)Nr)   nearest_neighborsrd      )rn   r]   rb   r   r'   rc   gh㈵>)r   r   r;   r)      r      ro   )r;   r)   r)   r   r   r   r   )rh   rh   rh   r;   rh   rh   rh   )   r   ri   rl   z1.11.3z=Only sparse matrices with 32-bit integer indices are acceptedmatch)r
   r,   r?   r@   rv   r   rw   r5   rJ   int32ry   hstackr]   tocsrindptrindicesr   r   rz   raises
ValueError)rf   r7   r|   se_amg	se_arpack	embed_amgembed_arpackrowcolvalr]   *scipy_graph_traversal_supports_int64_indexerr_msgs                r4   "test_spectral_embedding_amg_solverr      s    $YY**40F "$YY**40I $$QXXe_5I**188E?;L$YdC
 (((
9C
(((
9C
((4BHH
EC	C:	C:!6		3*8M NOH $FO&I$$X__U%;<I**8??5+ABL$YdC
 ~~Hoo,,RXX6HO''..rxx8H 2<}X?V1V.1X&Q]]:W5 	+  *	+ 	+ 	+s   <JJ c                 j   d}t        j                  ||d|      }|j                  |       }t        j                  |      t        j                  |j                               z
  }||j                  z   }t        |ddd      }t        d      D ]"  }t        |dd|d	z         }t        ||d
       $ y )Nrh   r=   )densityr'   r   rd   r   )rn   rb   r'   r   r;   r   )r0   )
r   randrw   triudiagsdiagonalr+   r   rD   r5   )	rf   r|   	num_nodesr   upper
sym_matrixr   rT   new_embeddings	            r4   *test_spectral_embedding_amg_solver_failurer   3  s     IIy#DIA	AKKNV\\!**,77EJ"%aI
 1X M*Re!a%
 	)MtL	Mr6   c                 T   t         j                  j                  |       }t        t        d|      }t        t        dd|      }||fD ]]  }t        t        |d      }|j                  |j                  t                     t        t        |j                  t              dd	       _ y )
Nr   )rn   r]   r'   r   r   )rn   r]   r   r'   r   )
n_clustersr'   n_initr!   r)   )r,   r?   r@   r
   r   r   r   rv   r   r   r   labels_true_labels)r|   r'   r   se_knnsekms         r4   !test_pipeline_spectral_clusteringr   J  s    99((.L%lF $!	F v 
zRP
r"#!([A3	

r6   c                    t        j                  g dg dg dg dg dg      }t        |      rJ t        D ]  }t         ||            sJ  t        D ]  }t         ||            sJ  t        j                  g dg dg dg dg dg      }t        |      sJ t        D ]  }t         ||            rJ  t        D ]  }t         ||            rJ  y )N)r;   r   r   r   r   )r   r;   r;   r   r   )r   r;   r;   r;   r   )r   r   r;   r;   r;   )r   r   r   r;   r;   )r;   r;   r   r   r   )r;   r;   r;   r   r   )r,   rJ   r   r   r   )r|   r   csr_containercsc_containers       r4   test_connectivityr   ^  s    HH	
E #5)))' =&}U';<<<=' =&}U';<<<= HH	
E u%%%' 9"=#78889' 9"=#78889r6   c                      t         j                  j                  d      } | j                  dd      }t	        |      }t        |      }t        |      }t        ||       y )N$   r      )r,   r?   r@   rr   r   r   r   )r'   r\   simsembedding_1embedding_2s        r4   %test_spectral_embedding_deterministicr     sP    99((,Lb"%DdD$T*K$T*Kk;7r6   c                  <   t         j                  j                  d      } | j                  dd      }t	        |      }d}t        |d|d      }t        |dd      \  }}t        |      \  }}|j                  d | }	t        |	      j                  }	t        ||	       y )	Nr   r   r      F)norm_laplacianrn   
drop_firstT)normedreturn_diag)r,   r?   r@   rr   r   r   csgraph_laplacianr   r+   r   r   )
r'   r\   r   rn   r   r   dd_diffusion_mapr   s
             r4   $test_spectral_embedding_unnormalizedr     s     99((,Lb"%DdDL$U%K
 &d5dKMIrIA}//-<0K1+>@@Kk;7r6   c                  j   t         j                  j                  d      } | j                  dd      }t	        |      }d}t        d      D ]g  }t        |d|d|      }t        j                  |d d df         t        j                  d      k(  sJ t        j                  |d d df         d	kD  rgJ  y )
Nr   r   r   r)   F)r   rn   r   r'   r   r;   gMbP?)
r,   r?   r@   rr   r   rD   r   stdrz   r{   )r'   r\   r   rn   r|   r   s         r4   *test_spectral_embedding_first_eigen_vectorr     s     99((,Lb"%DdDLb	 
.& %
	 vvi1o&&--*::::vvi1o&---
.r6   c                     t         j                  |      }t        dd| d      }|j                  |      }|j                  |k(  sJ |j
                  j                  |k(  sJ |j                  j                  |k(  sJ y)a\  Check that `SpectralEmbedding is preserving the dtype of the fitted
    attribute and transformed data.

    Ideally, this test should be covered by the common test
    `check_transformer_preserve_dtypes`. However, this test only run
    with transformers implementing `transform` while `SpectralEmbedding`
    implements only `fit_transform`.
    r)   r   r   )rn   r]   rb   r'   N)r   rw   r
   rv   rf   r   r   )rb   rf   r   r   X_transs        r4   'test_spectral_embedding_preserves_dtyper     s{    $ 	
A	\PQ
B q!G==E!!!==%'''$$---r6   z7PyAMG is installed and we should not test for an error.c                      t        ddd      } d}t        j                  t        |      5  | j	                  t
               d d d        y # 1 sw Y   y xY w)Nr)   r   rd   )rn   r]   rb   z>The eigen_solver was set to 'amg', but pyamg is not available.r   )r
   rz   r   r   rv   r   )r   r   s     r4   test_error_pyamg_not_availabler     sP    
 #J
 OG	z	1 $  #$ $ $s   AAsolver)rc   rd   r   r   c                    |dk(  rt         st        j                  d       t        ddddgddggd      \  }}t	        |      }t        j                  |      |z
  }|d	k(  rt        nt        }|d	k(  rdnd
}|dk(  r ||      }t        |      }	| j                  t        |j                  |	       t        |d|d       |	j                          |	j                  \  }}
|
d   |k(  sJ y
)z2Test that `eigen_tol="auto"` is resolved correctlyrd   zPyAMG is not available.r:   r   r;   rk   g{Gz?)r$   r'   r%   r&   rc   N)side_effectr#   auto)r'   rb   	eigen_tolr0   )pyamg_availablerz   skipr	   r   r,   r-   r   r   r   setattrr   __qualname__r   assert_called	call_args)monkeypatchr   r   r   r   Dr   solver_funcdefault_valuemocked_solverkwargss              r4   test_spectral_eigen_tol_autor    s     -.AAR/AtDAq 	1A
q	AA!X-%6K8+AM![1M+[-E-E}Uqr&Q!''IAv%=M)))r6   )r   )r   )r   )OrB   unittest.mockr   numpyr,   rz   scipyr   scipy.linalgr   scipy.sparse.linalgr   r   sklearn.clusterr   sklearn.datasetsr	   sklearn.manifoldr
   r   r   $sklearn.manifold._spectral_embeddingr   r   sklearn.metricsr   r   sklearn.metrics.pairwiser   sklearn.neighborsr   sklearn.utils._testingr   r   sklearn.utils.extmathr   sklearn.utils.fixesr   r   r   r   r   r   r   pyamgr   r   ImportErrormarkskipifskip_if_no_pyamgrJ   r%   r$   rj   r   
n_featuresr   r   r5   parametrizera   paramfloat32float64r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r4   <module>r     s         - " ' W W M / . P A  ?1O ;;%% S &  
 "((!!! 	  
Jc;

 .9$5 :$5V U"23 2::rzz":;)R <)RX +d-D^-DEU"23 2::rzz":;02E < FE4/, +d-D^-DEF FF2  S   2::rzz":;.93+ : <
3+l  S   2::rzz":;M <M&
(9B88(.* U"23 2::rzz":;. <.( D  $	$ #>?.9* : @*{  Os   <O   O+*O+