diff --git a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py index a2d9a6bf1c2c..e5bbb1f66000 100644 --- a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py +++ b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py @@ -3293,6 +3293,28 @@ def convert_maximum_scalar(node, **kwargs): return nodes +@mx_op.register('_minimum_scalar') +def convert_minimum_scalar(node, **kwargs): + """Map MXNet's _minimum_scalar + """ + from onnx.helper import make_node + name, input_nodes, attrs = get_inputs(node, kwargs) + + input_type = int(kwargs['in_type']) + dtype = onnx.mapping.TENSOR_TYPE_TO_NP_TYPE[input_type] + + scalar = None + if 'float' in str(dtype): + scalar = float(attrs.get('scalar', '0')) + else: + scalar = int(attrs.get('scalar', '0')) + + nodes = [ + create_tensor([scalar], name+'_scalar', kwargs['initializer'], dtype=dtype), + make_node('Min', [input_nodes[0], name+'_scalar'], [name], name=name) + ] + + return nodes @mx_op.register("_contrib_box_decode") def convert_contrib_box_decode(node, **kwargs): diff --git a/tests/python-pytest/onnx/test_operators.py b/tests/python-pytest/onnx/test_operators.py index 97eae9ff2aca..6a5cfd7f0b17 100644 --- a/tests/python-pytest/onnx/test_operators.py +++ b/tests/python-pytest/onnx/test_operators.py @@ -609,6 +609,16 @@ def test_onnx_maximum_scalar(tmp_path, dtype, shape): op_export_test('_maximum_scalar', M, [x], tmp_path) +# opset 8 Min only supports float types +# opset 12 and up suppots float and int +@pytest.mark.parametrize('dtype', ['float16', 'float32', 'float64']) +@pytest.mark.parametrize('shape', [(3, 4, 5), (1, 4, 1, 7)]) +def test_onnx_minimum_scalar(tmp_path, dtype, shape): + x = mx.random.uniform(0, 10, shape).astype(dtype) + M = def_model('minimum', right=5) + op_export_test('_minimum_scalar', M, [x], tmp_path) + + @pytest.mark.parametrize('dtype', ['float16', 'float32']) @pytest.mark.parametrize('fmt', ['corner', 'center']) @pytest.mark.parametrize('clip', [-1., 0., .5, 5.])