Source code for coremltools.converters.mil.mil.ops.defs.iOS17.reduction

#  Copyright (c) 2023, Apple Inc. All rights reserved.
#
#  Use of this source code is governed by a BSD-3-clause license that can be
#  found in the LICENSE.txt file or at https://opensource.org/licenses/BSD-3-Clause

import numpy as np

from coremltools.converters.mil.mil import types
from coremltools.converters.mil.mil.input_type import DefaultInputs, InputSpec, TensorInputType
from coremltools.converters.mil.mil.ops.defs._op_reqs import register_op
from coremltools.converters.mil.mil.ops.defs.iOS15.reduction import reduce_arg as _reduce_arg_iOS15
from coremltools.converters.mil.mil.ops.defs.iOS17 import _IOS17_TARGET


class reduce_arg(_reduce_arg_iOS15):
    _VALID_OUTPUT_DTYPES = ("int32", "uint16")

    input_spec = InputSpec(
        x=TensorInputType(type_domain="T"),
        axis=TensorInputType(const=True, optional=True, type_domain=types.int32),
        keep_dims=TensorInputType(const=True, optional=True, type_domain=types.bool),
        output_dtype=TensorInputType(const=True, optional=True, type_domain=types.str),
    )

    type_domains = {
        "T": (types.fp16, types.fp32, types.int32),
    }

    def default_inputs(self):
        return DefaultInputs(
            axis=-1,
            keep_dims=False,
            output_dtype="int32",
        )

    def type_inference(self):
        reduced_shape = self._find_reduced_shape()
        output_dtype = self.output_dtype.val.lower()
        if output_dtype not in self._VALID_OUTPUT_DTYPES:
            raise ValueError(
                f'Invalid "output_dtype" {output_dtype}. Only support {self._VALID_OUTPUT_DTYPES}'
            )
        return types.tensor(types.string_to_builtin(output_dtype), tuple(reduced_shape))


[docs]@register_op(opset_version=_IOS17_TARGET) class reduce_argmax(reduce_arg): """ Computes the indices of the maximum value across dimensions of a tensor. In case of ties, the identity of the return value is not guaranteed. The differences between this version and the iOS 15 :py:class:`~.iOS15.reduction.reduce_argmax` are: * The output supports uint16 dtype. * New optional input ``output_dtype``. Parameters ---------- x: <\*,T> (Required) * Must be 1-dimensional or higher. axis: const<i32> (Optional) * The dimension to reduce. Default is ``-1``. keep_dims: const<bool> (Optional, default=False) * If ``False``, the rank is reduced by ``1`` by removing the dimension specified in ``axis``. * If ``True``, retain reduced axis with length ``1``. output_dtype: const<str> (Optional) * Possible values: ``uint16``, ``int32``. * If set, then value type inference will output using that dtype. * Default is ``int32``. Returns ------- <\*, U> Attributes ---------- T: fp16, fp32, i32 U: int32, uint16 """ def get_operator(self): return np.argmax
[docs]@register_op(opset_version=_IOS17_TARGET) class reduce_argmin(reduce_arg): """ Computes the indices of the minimum value across dimensions of a tensor. In case of ties, the identity of the return value is not guaranteed. The differences between this version and the iOS 15 :py:class:`~.iOS15.reduction.reduce_argmin` are: * The output supports uint16 dtype. * New optional input ``output_dtype``. Parameters ---------- x: <\*,T> (Required) * Must be 1-dimensional or higher. axis: const<i32> (Optional) * The dimension to reduce. Default is ``-1``. keep_dims: const<bool> (Optional, default=False) * If ``False``, the rank is reduced by ``1`` by removing the dimension specified in ``axis``, otherwise retain reduced axis with length ``1``. output_dtype: const<str> (Optional) * Possible values: ``uint16``, ``int32``. * If set, then value type inference will output using that dtype. * Default is ``int32``. Returns ------- <\*, U> Attributes ---------- T: fp16, fp32, i32 U: int32, uint16 """ def get_operator(self): return np.argmin