
    P3j                        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 d dlmZ  e ej(                               Zd Zej.                  j1                  d e
d d	d
d
       e
d d	d
d       e
d d	dd
       e
d d	dd       e
 ed        ed      d
d
       e
 ed        ed      d
d       e
 ed        ed      dd
       e
 ed        ed      dd       e
ddd
d
       e
ddd
d       e
dddd
       e
dddd      g      d        Zej.                  j1                  de      d        Zej.                  j1                  d e             ej.                  j1                  de      d               Zy)    N)assert_allclose)config_context)_LINKSHalfLogitLinkIntervalMultinomialLogit_inclusive_low_high)_atol_for_typemove_to)yield_namespace_device_dtype_combinations)_array_api_for_testsc                      t        j                  t        d      5  t        dddd       ddd       y# 1 sw Y   yxY w)z5Test that interval with low > high raises ValueError.z-One must have low <= high; got low=1, high=0.)match   r   FN)pytestraises
ValueErrorr        J/DATA/.local/lib/python3.12/site-packages/sklearn/_loss/tests/test_link.pytest_interval_raisesr      s4    	I
 	Aue$
 
 
s   4=intervalr   FTinfc                    t        |       \  }}t        j                  ||d      }| j                  |      sJ | j                  t        j                  || j
                  f         | j                  k(  sJ | j                  t        j                  || j                  f         | j                  k(  sJ | j                  t        j                  || j
                  | j                  f         | j                  xr | j                  k(  sJ y)zHTest that low and high are always within the interval used for linspace.
   )numN)	r	   nplinspaceincludesr_lowlow_inclusivehighhigh_inclusive)r   r#   r%   xs       r   test_is_in_ranger(      s    & $H-IC
C2&AQ RUU1hll?348N8NNNN RUU1hmm#3459P9PPPP RUU1hllHMM#ABC:8#:#:  r   linkc                 "   t         j                  j                  |      } |        } d\  }}| j                  r:d}|j	                  dd||f      }t        | t              rK| j                  |      }n9t        | t              r|j	                  dd|      }n|j	                  dd|      }t        | j                  | j                  |            |       | j                  |      }t        | j                  | j                  |            |       y)z)Test that link of inverse gives identity.d   Nr      r#   r%   sizer   N)r   randomRandomStateis_multiclassuniform
isinstancer   symmetrize_raw_predictionr   r   r)   inverse)r)   global_random_seedrng	n_samples	n_classesraw_predictiony_preds          r   test_link_inverse_identityr>   C   s     ))

 2
3C6D$Iy 	2Y	<RSd,-!;;NKN	D-	(2YH2YHDIIdll>:;^L\\.)FDLL6!23V<r   z"namespace, device_name, dtype_namec                    t         j                  j                  |      } |       }d\  }}|j                  r:d}|j	                  dd||f      }t        |t              rK|j                  |      }n9t        |t              r|j	                  dd|      }n|j	                  dd|      }t        | ||      \  }	}
|dk7  r|dz  }|rd	nd
}nd}t        |      }t        d      5  |	j                  |j                  |      |
      }t        t        |j!                  |      t         d      |j!                  |      |       |j!                  |      }|	j                  |j                  |      |
      }t        t        |j#                  |      t         d      |j#                  |      ||       ddd       y# 1 sw Y   yxY w)zFTest that link and inverse link give same result for array API inputs.r+   r   r-   r.   r/   r   float64g      ?gMbP?g-C6?g:0yE>T)array_api_dispatch)devicecpu)xprB   )rtol)rE   atolN)r   r1   r2   r3   r4   r5   r   r6   r   r   r
   r   asarrayastyper   r   r7   r)   )	namespacedevice_name
dtype_namer)   r8   r9   r:   r;   r<   rD   rB   rE   rF   raw_prediction_xpr=   	y_pred_xps                   r   test_link_inverse_array_apirN   [   s    ))

 2
3C6D$Iy 	2Y	<RSd,-!;;NKN	D-	(2YH2YH%ijIJBY# td*%D	4	0JJ~'<'<Z'HQWJXDLL!235ILL(	
 n-JJv}}Z8JH	DIIi(R>IIf		
 
1	0	0s   %CF==G)numpyr   r   numpy.testingr   sklearnr   sklearn._loss.linkr   r   r   r   r	   sklearn.utils._array_apir
   r   r   sklearn.utils._testingr   listvaluesLINK_FUNCTIONSr   markparametrizefloatr(   r>   rN   r   r   r   <module>r[      s     ) "  
 8mfmmo&% Aue$Aud#AtU#AtT"%,eeU;%,eeT:%,edE:%,edD9b%'b%&b$&b$%"#"& 0= 1=. (-/ 0+
 1	
+
r   