Skip to content

Commit

Permalink
(feat): add support for microsoft.range operator for ONNX frontend
Browse files Browse the repository at this point in the history
Signed-off-by: 11happy <[email protected]>
  • Loading branch information
11happy committed Dec 25, 2024
1 parent 7fe89c7 commit 7a72a61
Show file tree
Hide file tree
Showing 4 changed files with 161 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/frontends/onnx/frontend/src/op/com.microsoft/range.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Copyright (C) 2018-2024 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//

#include "core/operator_set.hpp"
#include "openvino/op/ops.hpp"
#include "openvino/frontend/exception.hpp"

using namespace ov::op;

namespace ov {
namespace frontend {
namespace onnx {
namespace com_microsoft {
namespace opset_1 {
ov::OutputVector range(const ov::frontend::onnx::Node& node) {
auto nodes = node.get_ov_inputs();
FRONT_END_GENERAL_CHECK((nodes.size() == 2 || nodes.size() == 3), "Range takes 2 or 3 inputs. Provided " + std::to_string(nodes.size()));
auto start = nodes.at(0);
auto limit = nodes.at(1);
auto step = nodes.size() == 3 ? nodes.at(2) : ov::op::v0::Constant::create(start.get_element_type(), ov::Shape{}, {1});
return {std::make_shared<ov::op::v4::Range>(start, limit, step,start.get_element_type())};
}
ONNX_OP("Range", OPSET_SINCE(1), com_microsoft::opset_1::range, MICROSOFT_DOMAIN);
} // namespace opset_1
} // namespace com_microsoft
} // namespace onnx
} // namespace frontend
} // namespace ov
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
ir_version: 6
producer_name: "OpenVINO ONNX Frontend"
graph {
node {
input: "start"
input: "limit"
input: "delta"
output: "output"
op_type: "Range"
}
name: "test_range_float_type_with_delta"
input {
name: "start"
type {
tensor_type {
elem_type: 1
shape {
}
}
}
}
input {
name: "limit"
type {
tensor_type {
elem_type: 1
shape {
}
}
}
}
input {
name: "delta"
type {
tensor_type {
elem_type: 1
shape {
}
}
}
}
output {
name: "output"
type {
tensor_type {
elem_type: 1
shape {
dim {
dim_value: 10
}
}
}
}
}
}
opset_import {
version: 1
domain: "com.microsoft"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
ir_version: 6
producer_name: "OpenVINO ONNX Frontend"
graph {
node {
input: "start"
input: "limit"
output: "output"
op_type: "Range"
}
name: "test_range_float_type_without_delta"
input {
name: "start"
type {
tensor_type {
elem_type: 1
shape {
}
}
}
}
input {
name: "limit"
type {
tensor_type {
elem_type: 1
shape {
}
}
}
}
output {
name: "output"
type {
tensor_type {
elem_type: 1
shape {
dim {
dim_value: 10
}
}
}
}
}
}
opset_import {
version: 1
domain: "com.microsoft"
}
25 changes: 25 additions & 0 deletions src/frontends/onnx/tests/onnx_import_com_microsoft.in.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1488,3 +1488,28 @@ OPENVINO_TEST(${BACKEND_NAME}, onnx_com_microsoft_matmul_integer_to_float) {

test_case.run();
}

OPENVINO_TEST(${BACKEND_NAME}, onnx_com_microsoft_range_with_delta) {
const auto model = convert_model("com.microsoft/range_with_delta.onnx");
auto test_case = ov::test::TestCase(model, s_device);

test_case.add_input<float>({0.f});
test_case.add_input<float>({10.f});
test_case.add_input<float>({1.f});
test_case.add_expected_output<float>(Shape{10},
{0.f,1.f,2.f,3.f,4.f,5.f,6.f,7.f,8.f,9.f});

test_case.run();
}

OPENVINO_TEST(${BACKEND_NAME}, onnx_com_microsoft_range_without_delta) {
const auto model = convert_model("com.microsoft/range_without_delta.onnx");
auto test_case = ov::test::TestCase(model, s_device);

test_case.add_input<float>({0.f});
test_case.add_input<float>({10.f});
test_case.add_expected_output<float>(Shape{10},
{0.f,1.f,2.f,3.f,4.f,5.f,6.f,7.f,8.f,9.f});

test_case.run();
}

0 comments on commit 7a72a61

Please sign in to comment.