#
# * The source code in this file is based on the soure code of NumPy.
#
# # NLCPy License #
#
#     Copyright (c) 2020 NEC Corporation
#     All rights reserved.
#
#     Redistribution and use in source and binary forms, with or without
#     modification, are permitted provided that the following conditions are met:
#     * Redistributions of source code must retain the above copyright notice,
#       this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright notice,
#       this list of conditions and the following disclaimer in the documentation
#       and/or other materials provided with the distribution.
#     * Neither NEC Corporation nor the names of its contributors may be
#       used to endorse or promote products derived from this software
#       without specific prior written permission.
#
#     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
#     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
#     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
#     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
#     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# # NumPy License #
#
#     Copyright (c) 2005-2020, NumPy Developers.
#     All rights reserved.
#
#     Redistribution and use in source and binary forms, with or without
#     modification, are permitted provided that the following conditions are met:
#     * Redistributions of source code must retain the above copyright notice,
#       this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright notice,
#       this list of conditions and the following disclaimer in the documentation
#       and/or other materials provided with the distribution.
#     * Neither the name of the NumPy Developers nor the names of any contributors may be
#       used to endorse or promote products derived from this software
#       without specific prior written permission.
#
#     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
#     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
#     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
#     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
#     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
import nlcpy
[docs]def nanargmax(a, axis=None):
    """ Returns the indices of the maximum values in the specified axis ignoring NaNs.
    For all-NaN slices ``ValueError`` is raised. Warning: the results cannot be trusted
    if a slice contains only NaNs and -Infs.
    Parameters
    ----------
    a : array_like
        Input data.
    axis : int, optional
        Axis along which to operate. By default flattened input is used.
    Returns
    -------
    index_array : ndarray
        An array of indices or a single index value.
    See Also
    --------
    argmax : Returns the indices of the maximum values along an axis.
    nanargmin : Returns the indices of the minimum values in the specified axis
                ignoring NaNs.
    Examples
    --------
    >>> import nlcpy as vp
    >>> a = vp.array([[vp.nan, 4], [2, 3]])
    >>> vp.argmax(a)
    array(0)
    >>> vp.nanargmax(a)
    array(1)
    >>> vp.nanargmax(a, axis=0)
    array([1, 0])
    >>> vp.nanargmax(a, axis=1)
    array([1, 1])
    """
    a = nlcpy.array(a)
    if a.dtype.kind not in 'fc':
        return nlcpy.argmax(a, axis=axis)
    mask = nlcpy.isnan(a)
    if nlcpy.any(nlcpy.all(mask, axis=axis)):
        raise ValueError("All-NaN slice encountered")
    nlcpy.copyto(a, -nlcpy.inf, where=mask)
    return nlcpy.argmax(a, axis=axis) 
[docs]def nanargmin(a, axis=None):
    """ Returns the indices of the minimum values in the specified axis ignoring NaNs.
    For all-NaN slices ``ValueError`` is raised. Warning: the results cannot be trusted
    if a slice contains only NaNs and -Infs.
    Parameters
    ----------
    a : array_like
        Input data.
    axis : int, optional
        Axis along which to operate. By default flattened input is used.
    Returns
    -------
    index_array : ndarray
        An array of indices or a single index value.
    See Also
    --------
    argmin : Returns the indices of the minimum values along an axis.
    nanargmax : Returns the indices of the maximum values in the specified axis
                ignoring NaNs.
    Examples
    --------
    >>> import nlcpy as vp
    >>> a = vp.array([[vp.nan, 4], [2, 3]])
    >>> vp.argmin(a)
    array(0)
    >>> vp.nanargmin(a)
    array(2)
    >>> vp.nanargmin(a, axis=0)
    array([1, 1])
    >>> vp.nanargmin(a, axis=1)
    array([1, 0])
    """
    a = nlcpy.array(a)
    if a.dtype.kind not in 'fc':
        return nlcpy.argmin(a, axis=axis)
    mask = nlcpy.isnan(a)
    if nlcpy.any(nlcpy.all(mask, axis=axis)):
        raise ValueError("All-NaN slice encountered")
    nlcpy.copyto(a, nlcpy.inf, where=mask)
    return nlcpy.argmin(a, axis=axis)