§
    .�’jN-  ã                   ó´  — 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!dS )+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Úpadgñhãˆµøä>g:Œ0âŽyE>FN©ÚrtolÚatolÚ	equal_nanÚxpÚaÚbr   r   r   r   Úreturnc                ó†  — |€t          | |¦  «        n|}t          |¦  «        s-t          |¦  «        st          |¦  «        st	          |¦  «        r|                     | ||||¬¦  «        S t          |¦  «        r/t          | ||¬¦  «        \  } }|                     | ||||¬¦  «        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.
    N)r   r   r   ©r   r   )	r   r   r	   r
   r   r   r   r   r   )r   r   r   r   r   r   s         ú[C:\Projects\DSCons\.venv\Lib\site-packages\sklearn\externals\array_api_extra\_delegation.pyr   r      sç   € ðV #% *�˜˜AÑ	Ô	Ð	°"€Bõ 	˜2ÑÔðKå˜RÑ Ô ðKõ ˜RÑ Ô ðKõ ˜BÑÔð	Kð �zŠz˜!˜Q T°À	ˆzÑJÔJÐJå˜"ÑÔð KÝ˜˜1 Ð$Ñ$Ô$‰ˆˆ1Ø�zŠz˜!˜Q T°À	ˆzÑJÔJÐJåŒ>˜!˜Q T°À	ÈbÐQÑQÔQÐQó    g        ©Ú
fill_valuer   Úxr%   c               ór  — t          |t          ¦  «        rd}t          |¦  «        ‚|€t          | ¦  «        n|}|                     | ¦  «        }t          |¦  «        s-t          |¦  «        st          |¦  «        st          |¦  «        r| 	                    ||¬¦  «        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.N)Únanr$   )Ú
isinstanceÚcomplexÚ	TypeErrorr   Úasarrayr	   r   r   r   r   r   )r&   r%   r   ÚmsgÚys        r"   r   r   t   sÅ   € õv �*�gÑ&Ô&ð Ø6ˆÝ˜‰nŒnÐà!˜z�˜Ñ	Ô	Ð	¨r€Bð 	�
Š
�1‰Œ€Aõ 	˜"ÑÔð0å˜BÑÔð0õ ˜bÑ!Ô!ð0õ ˜bÑ!Ô!ð	0ð �}Š}˜Q Jˆ}Ñ/Ô/Ð/åÔ˜Q¨:¸"Ð=Ñ=Ô=Ð=r#   éÿÿÿÿ)ÚdtypeÚaxisr   Únum_classesr0   r1   c               óZ  — |€t          | ¦  «        }|                     | j        d¦  «        sd}t          |¦  «        ‚|€#t	          j        |t          | ¦  «        ¬¦  «        }t          |¦  «        rddlm	}  || |||¬¦  «        S t          |¦  «        rIddlm	} |                     | |j        ¦  «        } 	  || |¦  «        }n1# t          $ r}	t          |	‚d}	~	ww xY wt	          j	        | ||¬¦  «        }|                     ||d	¬
¦  «        }|dk    r|                     |d|¦  «        }|S )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   Ã   sd  € ðb 
€zÝ˜QÑÔˆØ�:Š:�a”g˜zÑ*Ô*ð Ø.ˆÝ˜‰nŒnÐØ€}ÝÔ$ Rµ
¸1±´Ð>Ñ>Ô>ˆå˜ÑÔð CØ1Ð1Ð1Ð1Ð1Ð1àˆ{˜1˜k°¸TÐBÑBÔBÐBÝ˜"ÑÔð 	4Ø@Ð@Ð@Ð@Ð@Ð@à�IŠI�a˜œÑ"Ô"ˆð	$Ø�-  ;Ñ/Ô/ˆCˆCøÝð 	$ð 	$ð 	$Ý !Ð#øøøøð	$øøøõ Œn˜Q °Ð3Ñ3Ô3ˆØ
�)Š)�C˜ Uˆ)Ñ
+Ô
+€CØˆr‚z€zØ�kŠk˜#˜r 4Ñ(Ô(ˆØ€Js   Â8C Ã
CÃCÃCÚconstant©Úconstant_valuesr   Ú	pad_widthÚmoderF   c                ób  — |€t          | ¦  «        n|}|dk    rd}t          |¦  «        ‚t          |¦  «        s-t          |¦  «        st	          |¦  «        st          |¦  «        r|                     | |||¬¦  «        S t          |¦  «        rŠ|                     |¦  «        }| 	                    || j
        df¦  «        }|                     |d¬¦  «                             ¦   «         }|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``.
    NrD   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�˜Ñ	Ô	Ð	¨r€BàˆzÒÐØ=ˆÝ! #Ñ&Ô&Ð&õ 	˜2ÑÔðKå˜RÑ Ô ðKõ ˜BÑÔðKõ & bÑ)Ô)ð	Kð �vŠv�a˜ D¸/ˆvÑJÔJÐJõ ˜"ÑÔð PØ—J’J˜yÑ)Ô)ˆ	Ø—O’O I°´¸¨{Ñ;Ô;ˆ	Ø—G’G˜I¨D�GÑ1Ô1×9Ò9Ñ;Ô;ˆ	ØŒuÔ×#Ò# A¥u¨YÑ'7Ô'7¸Ð#ÑOÔOÐOåŒ:�a˜°OÈÐKÑKÔ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Ð Fà $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 6Ð 5Ð 5Ð 5Ð 5Ð 5Ø *Ð *Ð *Ð *Ð *Ð *Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -à
5Ð
5Ð
5€ð ØØØ ðYRð YRð YRØˆw�ðYRàˆw�ðYRð ð	YRð
 ðYRð ðYRð 	�TÑðYRð ðYRð YRð YRð YRð@ "Ø ðL>ð L>ð L>Øˆu�}�wÑðL>ð �e‘ð	L>ð
 	�TÑðL>ð ðL>ð L>ð L>ð L>ðh ØØ ðJð Jð Jð ðJØðJð
 �4‰<ðJð ðJð 	�TÑðJð ðJð Jð Jð Jð` !+ð8Lð
  !Ø ð8Lð 8Lð 8LØð8Là�U˜3 ˜8”_Ñ$ x°°c¸3°h´Ô'@Ñ@ð8Lð �*Ô
ð8Lð
 ð8Lð 	�TÑð8Lð ð8Lð 8Lð 8Lð 8Lð 8Lð 8Lr#   