
    Q3j%              
          d dl mZ d dlmZ d dlZd dl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 d dlmZ d dlmZ d dlmZ ee	eeeeeeed	Ze eed	
      e
edZg dZddgZg dZej>                  jA                  d       Z!e!jE                  dd      Z#e!jE                  dd      Z$d Z%ejL                  jO                  deD  cg c]  } | e#e$f	 c}       d        Z(ejL                  jO                  deD  cg c]  } | e#e$f	 c}       d        Z)ejL                  jO                  de      d        Z*ejL                  jO                  d eee            d        Z+ejL                  jO                  d eee            d        Z,ejL                  jO                  dej[                               d        Z.ejL                  jO                  d e/efi eja                               d        Z1ejL                  jO                  d eee            d         Z2d! Z3e
e3gee3giZ4e4fd"Z5ejL                  jO                  d# e             ejL                  jO                  d$ e5             d%               Z6yc c} w c c} w )&    )partial)chainN)adjusted_mutual_info_scoreadjusted_rand_scorecalinski_harabasz_scorecompleteness_scoredavies_bouldin_scorefowlkes_mallows_scorehomogeneity_scoremutual_info_scorenormalized_mutual_info_score
rand_scoresilhouette_scorev_measure_score)check_array_api_metric))yield_namespace_device_dtype_combinations)assert_allclose)	r   r   r   r   r   r   r   r   r
   	manhattan)metric)r   silhouette_manhattanr   r	   )r   r   r   r   r   r   r
   r   r   )r   r   r   r   r   r   r
   r         sizec                  T    t        t        t        z         t        t              k(  sJ y N)sortedSYMMETRIC_METRICSNON_SYMMETRIC_METRICSSUPERVISED_METRICS     V/DATA/.local/lib/python3.12/site-packages/sklearn/metrics/cluster/tests/test_common.py"test_symmetric_non_symmetric_unionr$   a   s+    #&;;<A   r"   zmetric_name, y1, y2c                 f    t         |    } |||      t        j                   |||            k(  sJ y r   r    pytestapproxmetric_namey1y2r   s       r#   test_symmetryr-   g   1      ,F"b>V]]6"b>::::r"   c                 f    t         |    } |||      t        j                   |||            k7  sJ y r   r&   r)   s       r#   test_non_symmetryr0   o   r.   r"   r*   c                 |   g d}g d}t         |    } |g dg d      dkD  sJ  |g dg d      dkD  sJ  |g dg d      dk  sJ  |g dg d      dk  sJ  |||      t        j                  d      k(  sJ g d	}g d
}t        j                   |||       |||      g      }|dk  j                         rJ y )N)r   r   r      r2   r2   )r   r   r   r2   r2   )r   r   r   r2      g        )r   r   r2   r2   r3   )r   r   r2   r2   r2   )r   r2   r2   r2   r2   g      ?)r   r   r   r   r   r   )r   r2   r3   r         r   )r    r'   r(   nparrayany)r*   upper_bound_1upper_bound_2r   lower_bound_1lower_bound_2scores          r#   test_normalized_outputr>   w   s    &M&M,F/?3c999/?3c999/?3c999/?3c999-/6==3EEEE&M&MHH	}	-vm]/STE 	    r"   c                    t        j                  g d      }t        j                  g d      }| t        v rXt        |    } |||      }t        | |d|z
  |             t        | |d|z
  d|z
               t        | ||d|z
               y t        |    }t         j
                  j                  dd      } |||      }t        | ||d|z
               y )N)r   r   r   r2   r2   r   r2   r2   r   r2   r   r2   r2   r   r2   
      rA   r   )r6   r7   r    r   UNSUPERVISED_METRICSrandomrandint)r*   y_labely_predr   score_1Xs         r#   test_permute_labelsrK      s     hh,-GXX+,F((#K0)F
G!<=F
AK!@AG!<=%k2IIbw/F#1v:!67r"   c                    g d}g d}d }| t         v rKt         |    } |||      } ||      } ||      }t        ||      D ]  \  \  }}	\  }
}| |||
      k(  rJ  y t        |    }t        j                  j                  dd      } |||      }| ||j                  t              |      k(  sJ  ||      }|D ]  \  }}	| |||      k(  rJ  y )N)r   r   r   r   r2   r2   r2   r2   )r   r2   r3   r   r4   r5      rC   c              3     K   t        j                  |       } | df | j                         df | j                         D cg c]  }t        |      dz    c}df t        j                  | j                         D cg c]  }t        |      dz    c}t              df | dz
  df | dz   d	f y c c}w c c}w w)
Nzarray of intszlist of intsz-azlist of strs)dtypezarray of strsr2   zincluding negative intszstrictly positive ints)r6   r7   toliststrobject)yxs     r#   generate_formatsz0test_format_invariance.<locals>.generate_formats   s     HHQK  hhj.((&'hhj1js1v}j1>AAHHQXXZ8Zc!ftmZ8G
 	
 !e...!e--- 28s   ACB:(CB?.CrA   )   rA   r   )r    ziprD   r6   rE   rF   astypefloat)r*   y_truerH   rU   r   rI   
y_true_gen
y_pred_gen
y_true_fmtfmt_name
y_pred_fmt_rJ   s                r#   test_format_invariancera      s     &F%F
. ((#K0(%f-
%f-
7::z7R3"ZOZfZ<<<< 8S &k2IIbw/F#&%&9999%f-
$. JfQ
3333 %/r"   r   c                 .    dD ]  \  }} | |g|g        y )N))r   r   )r   r2   )r2   r   )r2   r2   r!   )r   ijs      r#   test_single_samplere      s      11sQC 1r"   zmetric_name, metric_funcc                 r   | t         v rlddgt        j                  t        j                  gfddgt        j                  t        j                  gfddgt        j                  t        j                  gfg}nt        j                  j                  dd      }|t        j                  t        j                  gf|t        j                  t        j                  gf|t        j                  t        j                  gfg}t        j                  t        d      5  |D ]  } ||  	 	 d d d        y # 1 sw Y   y xY w)Nr   r2   rA   )r3   rA   r   zcontains (NaN|infinity))match)	r    r6   infnanrE   rF   r'   raises
ValueError)r*   metric_funcinvalidsrJ   argss        r#   test_inf_nan_inputro      s     ((Vbffbff%&Vbffbff%&Vbffbff%&
 IIbw/()A/?+@1rvvrvvFVBWX	z)C	DD  
E	D	Ds   D--D6namec                    t         j                  j                  d      }|j                  dd      }|j                  ddd      }|j                  ddd      }| t        v rt        |    } |||      }nt
        |    } |||      }t        |t              sJ t        |t         j                  t         j                  f      rJ y)zEnsure that the returned values of all metrics are consistent.

    It can only be a float. It should not be a numpy float64 or float32.
    r   rA   )   rA   r   r   )rr   N)
r6   rE   RandomStaterF   r    rD   
isinstancerY   float64float32)rp   rngrJ   labels_truelabels_predr   r=   s          r#   test_returned_value_consistencyrz      s     ))


"CBX&A++a+/K++a+/K!!#D){K0%d+q+&eU###%"**bjj!9::::r"   c                     t        j                  g d      }t         j                  j                  dd      }t	        | |||||       y )Nr@   rA   rB   r   )a_npb_np)r6   r7   rE   rF   r   )r   array_namespacedevice_name
dtype_namerH   rJ   s         r#   #check_array_api_unsupervised_metricr      sF     XX+,F
		"7+Ar"   c              #   V   K   | j                         D ]  \  }}|D ]  }||f 
  y wr   )items)metric_checkersr   checkerscheckers       r#   !yield_metric_checker_combinationsr     s2     +113G'/!   4s   ')z(array_namespace, device_name, dtype_namezmetric, check_funcc                      || |||       y r   r!   )r   r~   r   r   
check_funcs        r#   test_array_api_compliancer     s     vZ@r"   )7	functoolsr   	itertoolsr   numpyr6   r'   sklearn.metrics.clusterr   r   r   r   r	   r
   r   r   r   r   r   r   !sklearn.metrics.tests.test_commonr   sklearn.utils._array_apir   sklearn.utils._testingr   r    rD   r   r   NORMALIZED_METRICSrE   rs   rw   rF   r+   r,   r$   markparametrizer-   r0   r>   rK   ra   valuesre   dictr   ro   rz   r   array_api_metric_checkersr   r   )rp   s   0r#   <module>r      s          E 3 #=.,**$@&2
  )#$4[I60	    -.BC 	  	iiA[[[[[[ 7HI7HtT2rN7HI;;
 7LM7LtT2rN7LM;;
 (:;! <!$ .@BV(WX8 Y8$ .@BV(WX4 Y4B #5#<#<#>? @ %7 P;O P V V X '9;O!PQ; R;," + +	  7P " .-/ -/P/RSA T	
A] J Ns   I4
;I9
