
    ri,                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	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mZ g dZddddddeez  deez  dededededz  defdZddddeez  ez  deez  dedz  defdZddddd eded!edz  d"ededz  defd#Z	 d*ddd%ded&ee eef   z  ee eef      z  d'ed$   d(ededz  defd)Z!y)+z@Delegation to existing implementations for Public API Functions.    )Sequence)
ModuleType)Literal   )_funcs)array_namespaceis_cupy_namespaceis_dask_namespaceis_jax_namespaceis_numpy_namespaceis_pydata_sparse_namespaceis_torch_namespacedevice)asarrays)ArrayDType)isclose
nan_to_numone_hotpadgh㈵>g:0yE>FNrtolatol	equal_nanxpabr   r   r   r   returnc                @   |t        | |      n|}t        |      s!t        |      st        |      st	        |      r|j                  | ||||      S t        |      r't        | ||      \  } }|j                  | ||||      S t        j
                  | |||||      S )a
  
    Return a boolean array where two arrays are element-wise equal within a tolerance.

    The tolerance values are positive, typically very small numbers. The relative
    difference ``(rtol * abs(b))`` and the absolute difference `atol` are added together
    to compare against the absolute difference between `a` and `b`.

    NaNs are treated as equal if they are in the same place and if ``equal_nan=True``.
    Infs are treated as equal if they are in the same place and of the same sign in both
    arrays.

    Parameters
    ----------
    a, b : Array | int | float | complex | bool
        Input objects to compare. At least one must be an array.
    rtol : array_like, optional
        The relative tolerance parameter (see Notes).
    atol : array_like, optional
        The absolute tolerance parameter (see Notes).
    equal_nan : bool, optional
        Whether to compare NaN's as equal. If True, NaN's in `a` will be considered
        equal to NaN's in `b` in the output array.
    xp : array_namespace, optional
        The standard-compatible namespace for `a` and `b`. Default: infer.

    Returns
    -------
    Array
        A boolean array of shape broadcasted from `a` and `b`, containing ``True`` where
        `a` is close to `b`, and ``False`` otherwise.

    Warnings
    --------
    The default `atol` is not appropriate for comparing numbers with magnitudes much
    smaller than one (see notes).

    See Also
    --------
    math.isclose : Similar function in stdlib for Python scalars.

    Notes
    -----
    For finite values, `isclose` uses the following equation to test whether two
    floating point values are equivalent::

        absolute(a - b) <= (atol + rtol * absolute(b))

    Unlike the built-in `math.isclose`,
    the above equation is not symmetric in `a` and `b`,
    so that ``isclose(a, b)`` might be different from ``isclose(b, a)`` in some rare
    cases.

    The default value of `atol` is not appropriate when the reference value `b` has
    magnitude smaller than one. For example, it is unlikely that ``a = 1e-9`` and
    ``b = 2e-9`` should be considered "close", yet ``isclose(1e-9, 2e-9)`` is ``True``
    with default settings. Be sure to select `atol` for the use case at hand, especially
    for defining the threshold below which a non-zero value in `a` will be considered
    "close" to a very small or zero value in `b`.

    The comparison of `a` and `b` uses standard broadcasting, which means that `a` and
    `b` need not have the same shape in order for ``isclose(a, b)`` to evaluate to
    ``True``.

    `isclose` is not defined for non-numeric data types.
    ``bool`` is considered a numeric data-type for this purpose.
    )r   r   r   r   r   )	r   r   r	   r
   r   r   r   r   r   )r   r   r   r   r   r   s         k/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/sklearn/externals/array_api_extra/_delegation.pyr   r      s    V #%*A	"B 	2R R Bzz!QT	zJJ"1$1zz!QT	zJJ>>!QT	bQQ    g        
fill_valuer   xr%   c               *   t        |t              rd}t        |      |t        |       n|}|j	                  |       }t        |      s!t        |      st        |      st        |      r|j                  ||      S t        j                  |||      S )as  
    Replace NaN with zero and infinity with large finite numbers (default behaviour).

    If `x` is inexact, NaN is replaced by zero or by the user defined value in the
    `fill_value` keyword, infinity is replaced by the largest finite floating
    point value representable by ``x.dtype``, and -infinity is replaced by the
    most negative finite floating point value representable by ``x.dtype``.

    For complex dtypes, the above is applied to each of the real and
    imaginary components of `x` separately.

    Parameters
    ----------
    x : array | float | complex
        Input data.
    fill_value : int | float, optional
        Value to be used to fill NaN values. If no value is passed
        then NaN values will be replaced with 0.0.
    xp : array_namespace, optional
        The standard-compatible namespace for `x`. Default: infer.

    Returns
    -------
    array
        `x`, with the non-finite values replaced.

    See Also
    --------
    array_api.isnan : Shows which elements are Not a Number (NaN).

    Examples
    --------
    >>> import array_api_extra as xpx
    >>> import array_api_strict as xp
    >>> xpx.nan_to_num(xp.inf)
    1.7976931348623157e+308
    >>> xpx.nan_to_num(-xp.inf)
    -1.7976931348623157e+308
    >>> xpx.nan_to_num(xp.nan)
    0.0
    >>> x = xp.asarray([xp.inf, -xp.inf, xp.nan, -128, 128])
    >>> xpx.nan_to_num(x)
    array([ 1.79769313e+308, -1.79769313e+308,  0.00000000e+000, # may vary
           -1.28000000e+002,  1.28000000e+002])
    >>> y = xp.asarray([complex(xp.inf, xp.nan), xp.nan, complex(xp.nan, xp.inf)])
    array([  1.79769313e+308,  -1.79769313e+308,   0.00000000e+000, # may vary
         -1.28000000e+002,   1.28000000e+002])
    >>> xpx.nan_to_num(y)
    array([  1.79769313e+308 +0.00000000e+000j, # may vary
             0.00000000e+000 +0.00000000e+000j,
             0.00000000e+000 +1.79769313e+308j])
    z&Complex fill values are not supported.)nanr$   )
isinstancecomplex	TypeErrorr   asarrayr	   r   r   r   r   r   )r&   r%   r   msgys        r"   r   r   t   s    v *g&6n!z	rB 	

1A 	"Bb!b!}}QJ}//Q:"==r#   )dtypeaxisr   num_classesr0   r1   c                  |t        |       }|j                  | j                  d      sd}t        |      | t	        j
                  |t        |             }t        |      rddlm	}  || |||      S t        |      r-ddlm	} |j                  | |j                        } 	  || |      }nt	        j                  | ||      }|j                  ||d	
      }|dk7  r|j!                  |d|      }|S # t        $ r}	t        |	d}	~	ww xY w)au  
    One-hot encode the given indices.

    Each index in the input `x` is encoded as a vector of zeros of length `num_classes`
    with the element at the given index set to one.

    Parameters
    ----------
    x : array
        An array with integral dtype whose values are between `0` and `num_classes - 1`.
    num_classes : int
        Number of classes in the one-hot dimension.
    dtype : DType, optional
        The dtype of the return value.  Defaults to the default float dtype (usually
        float64).
    axis : int, optional
        Position in the expanded axes where the new axis is placed. Default: -1.
    xp : array_namespace, optional
        The standard-compatible namespace for `x`. Default: infer.

    Returns
    -------
    array
        An array having the same shape as `x` except for a new axis at the position
        given by `axis` having size `num_classes`.  If `axis` is unspecified, it
        defaults to -1, which appends a new axis.

        If ``x < 0`` or ``x >= num_classes``, then the result is undefined, may raise
        an exception, or may even cause a bad state.  `x` is not checked.

    Examples
    --------
    >>> import array_api_extra as xpx
    >>> import array_api_strict as xp
    >>> xpx.one_hot(xp.asarray([1, 2, 0]), 3)
    Array([[0., 1., 0.],
          [0., 0., 1.],
          [1., 0., 0.]], dtype=array_api_strict.float64)
    Nintegralzx must have an integral dtype.r   r   )r   )r0   r1   r!   F)copyr/   )r   isdtyper0   r+   r   default_dtype
get_devicer   jax.nnr   r   torch.nn.functionalastypeint64RuntimeError
IndexErrormoveaxis)
r&   r2   r0   r1   r   r-   jax_one_hottorch_one_hotoutes
             r"   r   r      s    b 
zQ::aggz*.n}$$R
1>11kTBB"@IIa"	$;/C nnQ3
))CU)
+Crzkk#r4(J  	$!#	$s   $	C4 4	D	=DD	constantconstant_valuesr   	pad_widthmoderF   c                   |t        |       n|}|dk7  rd}t        |      t        |      s!t        |      st	        |      st        |      r|j                  | |||      S t        |      r|j                  |      }|j                  || j                  df      }|j                  |d      j                         }|j                  j                  j                  | t        |      |      S t!        j                  | |||      S )	a  
    Pad the input array.

    Parameters
    ----------
    x : array
        Input array.
    pad_width : int or tuple of ints or sequence of pairs of ints
        Pad the input array with this many elements from each side.
        If a sequence of tuples, ``[(before_0, after_0), ... (before_N, after_N)]``,
        each pair applies to the corresponding axis of ``x``.
        A single tuple, ``(before, after)``, is equivalent to a list of ``x.ndim``
        copies of this tuple.
    mode : str, optional
        Only "constant" mode is currently supported, which pads with
        the value passed to `constant_values`.
    constant_values : python scalar, optional
        Use this value to pad the input. Default is zero.
    xp : array_namespace, optional
        The standard-compatible namespace for `x`. Default: infer.

    Returns
    -------
    array
        The input array,
        padded with ``pad_width`` elements equal to ``constant_values``.
    rD   z-Only `'constant'` mode is currently supported)rF      )r   )r1   )valuerE   )r   NotImplementedErrorr   r	   r   r   r   r   r,   broadcast_tondimflipflattennn
functionaltupler   )r&   rG   rH   rF   r   r-   s         r"   r   r     s    F  "z	rBz=!#&& 	2R B%b)vvaD/vJJ "JJy)	OOI{;	GGIDG199;	uu##AuY'7#OO::aOKKr#   )rD   )"__doc__collections.abcr   typesr   typingr   _libr   _lib._utils._compatr   r	   r
   r   r   r   r   r   r8   _lib._utils._helpersr   _lib._utils._typingr   r   __all__r*   floatboolr   intr   r   rS   r    r#   r"   <module>ra      s   F $      6 * -
5  YRwYRwYR 	YR
 YR YR 	TYR YR@ " L>u}wL> e	L>
 	TL> L>h  J JJ
 4<J J 	TJ J` !+8L
  ! 8L8LU38_$xc3h'@@8L *
8L
 8L 	T8L 8Lr#   