
    >[gdE              
          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^                  ja                  e- d      Z1 ejd                  g dg dg dg      Z3dZ4e3jj                  \  Z6Z7 ee4e3dd      \  Z8Z9d9dZ:ej^                  jw                  de$      d        Z<ej^                  jw                  d d!d" ejz                  d#e1$      g      ej^                  jw                  d%ej|                  ej~                  g      d:d&              Z@ej^                  jw                  d'dge&      ej^                  jw                  d d!d" ejz                  d#e1$      g      ej^                  jw                  d%ej|                  ej~                  f      	 d;d(                     ZAd) ZBej^                  jw                  d'dge&      d;d*       ZCej^                  ja                  e- d      ej^                  jw                  d%ej|                  ej~                  f      ej^                  jw                  de$      d;d+                     ZDej^                  ja                  e- d      ej^                  jw                  d%ej|                  ej~                  f      d;d,              ZEd;d-ZFd;d.ZGd/ ZHd0 ZId1 ZJej^                  jw                  d d!d" ejz                  d#e1$      g      ej^                  jw                  d%ej|                  ej~                  g      d2               ZKej^                  ja                  e-d3      d4        ZLej^                  jw                  d5g d6      ej^                  jw                  d7e&      d8               ZMy# e.$ r dZ-Y fw xY w)<    )MockN)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         i/var/www/html/bid-api/venv/lib/python3.12/site-packages/sklearn/manifold/tests/test_spectral_embedding.py _assert_equal_with_sign_flippingr5   7   sg     q&KACCuFFEEMa'(K7vvuu}*+{:	
; &    coo_containerc                    t         j                  j                  d      }d}dddd|g}|j                  |      }g }t	        |d d |dd        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	        |d d |dd        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permutationr*   rangelenappendrandintextend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_componentr`   B   s   
))


#CIRc9-J	"AK:cr?JqrN;t% s5zA~&Aa%A,78 ' c%j1n#Wg4HIWg4HI3uV}eFm<= <   5 7 78GZ;;sBS%5;6DdWj$9:;Hh+,H:cr?JqrN;t01U8D N222 11TAX;G N222;4 <r6   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<   r?   precomputedn_componentsr\   r'   ra   re   r!   )r,   r@   rA   zerosabsrandnr   allanyflatr+   r
   fit_transformastyperI   ravelint64r   pytestapprox)ra   re   seedr'   n_sampler\   	component
true_label
se_precompembedded_coordinatelabel_s              r4   &test_spectral_embedding_two_componentsr   n   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)   rj   rk   rbf)rl   r\   gammar'   ra   r   皙?)Sr
   r,   r@   rA   rt   r   ru   r   affinity_matrix_r5   )
r   ra   re   rz   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'   rl   r\   r   r<   )r   fitr   kneighbors_graphr
   
embedding_rE   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6r6   )rl   r\   r   r'   r   r   )
r   r   r
   r,   r@   rA   rt   r   r   r5   )	r   rz   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_neighborsrc      )rl   r\   ra   r   r'   rb   gh㈵>)r   r   r<   r)      r      rm   )r<   r)   r)   r   r   r   r   )rg   rg   rg   r<   rg   rg   rg   )   r   rh   rj   z1.11.3z=Only sparse matrices with 32-bit integer indices are acceptedmatch)r
   r,   r@   rA   rt   r   ru   r5   rI   int32rw   hstackr\   tocsrindptrindicesr   r   rx   raises
ValueError)re   r7   rz   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  * 655s   <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 )Nrg   r>   )densityr'   r   rc   r   )rl   ra   r'   r   r<   r   )r0   )
r   randru   triudiagsdiagonalr+   r   rC   r5   )	re   rz   	num_nodesr   upper
sym_matrixr   rS   new_embeddings	            r4   *test_spectral_embedding_amg_solver_failurer   2  s     IIy#DIA	AKKNV\\!**,77EJ"%aI
 1X*Re!a%
 	)MtL	 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   )rl   r\   r'   r   r   )rl   r\   r   r'   r   )
n_clustersr'   n_initr!   r)   )r,   r@   rA   r
   r   r   r   rt   r   r   r   labels_true_labels)rz   r'   r   se_knnsekms         r4   !test_pipeline_spectral_clusteringr   I  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,   rI   r   r   r   )rz   r   csr_containercsc_containers       r4   test_connectivityr   ]  s    HH	
E #5)))'&}U';<<< ('&}U';<<< ( HH	
E u%%%'"=#7888 ('"=#7888 (r6   c                      t         j                  j                  d      } | j                  dd      }t	        |      }t        |      }t        |      }t        ||       y )N$   r      )r,   r@   rA   rp   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_laplacianrl   
drop_firstT)normedreturn_diag)r,   r@   rA   rp   r   r   csgraph_laplacianr   r+   r   r   )
r'   r[   r   rl   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   rl   r   r'   r   r<   gMbP?)
r,   r@   rA   rp   r   rC   r   stdrx   ry   )r'   r[   r   rl   rz   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   )rl   r\   ra   r'   N)r   ru   r
   rt   re   r   r   )ra   re   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   rc   )rl   r\   ra   z>The eigen_solver was set to 'amg', but pyamg is not available.r   )r
   rx   r   r   rt   r   )r~   r   s     r4   test_error_pyamg_not_availabler     sG    
 #J
 OG	z	1  # 
2	1	1s   AAsolver)rb   rc   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 correctlyrc   zPyAMG is not available.r:   r   r<   r;   g{Gz?)r$   r'   r%   r&   rb   N)side_effectr#   auto)r'   ra   	eigen_tolr0   )pyamg_availablerx   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   )Nunittest.mockr   numpyr,   rx   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_pyamgrI   r%   r$   ri   r   
n_featuresr   r   r5   parametrizer`   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   8O O'&O'