From 9f87f72ca68b89327397d3f8453dd13fdcce3938 Mon Sep 17 00:00:00 2001 From: Roman Kazantsev Date: Sat, 25 Nov 2023 01:06:20 +0400 Subject: [PATCH] [TF FE] Speed up compilation - part 4 (#21269) Signed-off-by: Kazantsev, Roman --- .../src/op/random_uniform.cpp | 18 +++++---- .../tensorflow_common/src/op/range.cpp | 12 +++--- .../tensorflow_common/src/op/rank.cpp | 11 ++--- .../tensorflow_common/src/op/reciprocal.cpp | 6 +-- .../tensorflow_common/src/op/reduce.cpp | 26 +++++++----- .../tensorflow_common/src/op/reshape.cpp | 7 ++-- .../tensorflow_common/src/op/reverse.cpp | 35 +++++++++------- .../src/op/reverse_sequence.cpp | 7 ++-- .../tensorflow_common/src/op/scatter_nd.cpp | 9 +++-- .../tensorflow_common/src/op/segment_sum.cpp | 26 +++++++----- .../tensorflow_common/src/op/select.cpp | 32 +++++++++------ .../tensorflow_common/src/op/size.cpp | 17 ++++---- .../tensorflow_common/src/op/slice.cpp | 27 ++++++++----- .../tensorflow_common/src/op/softmax.cpp | 7 ++-- .../src/op/space_to_batch_nd.cpp | 40 +++++++++++-------- .../src/op/space_to_depth.cpp | 9 +++-- .../src/op/sparse_to_dense.cpp | 13 +++--- .../tensorflow_common/src/op/split.cpp | 10 +++-- .../tensorflow_common/src/op/sqrt.cpp | 6 +-- .../tensorflow_common/src/op/squeeze.cpp | 10 +++-- .../src/op/strided_slice.cpp | 23 ++++++----- 21 files changed, 206 insertions(+), 145 deletions(-) diff --git a/src/frontends/tensorflow_common/src/op/random_uniform.cpp b/src/frontends/tensorflow_common/src/op/random_uniform.cpp index 4b1b0683806..a4fb77b44e6 100644 --- a/src/frontends/tensorflow_common/src/op/random_uniform.cpp +++ b/src/frontends/tensorflow_common/src/op/random_uniform.cpp @@ -2,11 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "openvino/op/random_uniform.hpp" + #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" +#include "openvino/op/constant.hpp" using namespace std; -using namespace ov::opset8; +using namespace ov::op; namespace ov { namespace frontend { @@ -21,9 +23,9 @@ ov::OutputVector translate_random_uniform_op(const NodeContext& node) { auto seed2 = node.get_attribute("seed2", 0); auto output_type = node.get_attribute("dtype"); - auto minval = make_shared(output_type, Shape{}, 0); - auto maxval = make_shared(output_type, Shape{}, 1); - auto random = std::make_shared(shape, minval, maxval, output_type, seed, seed2); + auto minval = make_shared(output_type, Shape{}, 0); + auto maxval = make_shared(output_type, Shape{}, 1); + auto random = std::make_shared(shape, minval, maxval, output_type, seed, seed2); set_node_name(node.get_name(), random); return random->outputs(); @@ -42,10 +44,10 @@ ov::OutputVector translate_random_uniform_int_op(const NodeContext& node) { auto output_type = minval.get_element_type(); Output random; if (output_type.is_static()) { - random = std::make_shared(shape, minval, maxval, output_type, seed, seed2); + random = std::make_shared(shape, minval, maxval, output_type, seed, seed2); } else { - random = std::make_shared(shape, minval, maxval, element::i64, seed, seed2); - random = make_shared(random, minval); + random = std::make_shared(shape, minval, maxval, element::i64, seed, seed2); + random = make_shared(random, minval); } set_node_name(node.get_name(), random.get_node_shared_ptr()); diff --git a/src/frontends/tensorflow_common/src/op/range.cpp b/src/frontends/tensorflow_common/src/op/range.cpp index 64cbf209490..db0b07a5e12 100644 --- a/src/frontends/tensorflow_common/src/op/range.cpp +++ b/src/frontends/tensorflow_common/src/op/range.cpp @@ -2,11 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "openvino/op/range.hpp" + #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" +#include "openvino/op/convert_like.hpp" using namespace std; -using namespace ov::opset8; +using namespace ov::op; namespace ov { namespace frontend { @@ -22,10 +24,10 @@ OutputVector translate_range_op(const NodeContext& node) { auto start_type = start.get_element_type(); Output range; if (start_type.is_static()) { - range = make_shared(start, limit, delta, start_type); + range = make_shared(start, limit, delta, start_type); } else { - range = make_shared(start, limit, delta, element::f32); - range = make_shared(range, start); + range = make_shared(start, limit, delta, element::f32); + range = make_shared(range, start); } set_node_name(node.get_name(), range.get_node_shared_ptr()); return {range}; diff --git a/src/frontends/tensorflow_common/src/op/rank.cpp b/src/frontends/tensorflow_common/src/op/rank.cpp index 8a87eac88e8..1c37dfa5a0e 100644 --- a/src/frontends/tensorflow_common/src/op/rank.cpp +++ b/src/frontends/tensorflow_common/src/op/rank.cpp @@ -3,10 +3,11 @@ // #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" +#include "openvino/op/shape_of.hpp" +#include "openvino/op/squeeze.hpp" using namespace std; -using namespace ov::opset8; +using namespace ov::op; namespace ov { namespace frontend { @@ -16,9 +17,9 @@ namespace op { ov::OutputVector translate_rank_op(const NodeContext& node) { default_op_checks(node, 1, {"Rank"}); auto input = node.get_input(0); - auto input_shape = make_shared(input, ov::element::i32); - auto unsqueeze_input_rank = make_shared(input_shape, ov::element::i32); - auto input_rank = make_shared(unsqueeze_input_rank); + auto input_shape = make_shared(input, ov::element::i32); + auto unsqueeze_input_rank = make_shared(input_shape, ov::element::i32); + auto input_rank = make_shared(unsqueeze_input_rank); set_node_name(node.get_name(), input_rank); return {input_rank}; } diff --git a/src/frontends/tensorflow_common/src/op/reciprocal.cpp b/src/frontends/tensorflow_common/src/op/reciprocal.cpp index 98d37ff9a33..13fc65858e5 100644 --- a/src/frontends/tensorflow_common/src/op/reciprocal.cpp +++ b/src/frontends/tensorflow_common/src/op/reciprocal.cpp @@ -3,11 +3,11 @@ // #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" +#include "openvino/op/power.hpp" #include "utils.hpp" using namespace std; -using namespace ov::opset8; +using namespace ov::op; namespace ov { namespace frontend { @@ -19,7 +19,7 @@ OutputVector translate_reciprocal_op(const NodeContext& node) { default_op_checks(node, 1, {"Reciprocal"}); auto x = node.get_input(0); auto minus_one_const = create_same_type_const_scalar(x, -1); - auto reciprocal = make_shared(x, minus_one_const); + auto reciprocal = make_shared(x, minus_one_const); set_node_name(node.get_name(), reciprocal); return {reciprocal}; } diff --git a/src/frontends/tensorflow_common/src/op/reduce.cpp b/src/frontends/tensorflow_common/src/op/reduce.cpp index 363093d943e..8affb37dc50 100644 --- a/src/frontends/tensorflow_common/src/op/reduce.cpp +++ b/src/frontends/tensorflow_common/src/op/reduce.cpp @@ -3,10 +3,16 @@ // #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" +#include "openvino/op/reduce_l2.hpp" +#include "openvino/op/reduce_logical_and.hpp" +#include "openvino/op/reduce_logical_or.hpp" +#include "openvino/op/reduce_max.hpp" +#include "openvino/op/reduce_mean.hpp" +#include "openvino/op/reduce_min.hpp" +#include "openvino/op/reduce_sum.hpp" using namespace std; -using namespace ov::opset8; +using namespace ov::op; namespace ov { namespace frontend { @@ -24,14 +30,14 @@ OutputVector translate_direct_reduce_op(const NodeContext& node) { return {reduce_op}; } -template OutputVector translate_direct_reduce_op(const NodeContext& node); -template OutputVector translate_direct_reduce_op(const NodeContext& node); -template OutputVector translate_direct_reduce_op(const NodeContext& node); -template OutputVector translate_direct_reduce_op(const NodeContext& node); -template OutputVector translate_direct_reduce_op(const NodeContext& node); -template OutputVector translate_direct_reduce_op(const NodeContext& node); -template OutputVector translate_direct_reduce_op(const NodeContext& node); -template OutputVector translate_direct_reduce_op(const NodeContext& node); +template OutputVector translate_direct_reduce_op(const NodeContext& node); +template OutputVector translate_direct_reduce_op(const NodeContext& node); +template OutputVector translate_direct_reduce_op(const NodeContext& node); +template OutputVector translate_direct_reduce_op(const NodeContext& node); +template OutputVector translate_direct_reduce_op(const NodeContext& node); +template OutputVector translate_direct_reduce_op(const NodeContext& node); +template OutputVector translate_direct_reduce_op(const NodeContext& node); +template OutputVector translate_direct_reduce_op(const NodeContext& node); } // namespace op } // namespace tensorflow } // namespace frontend diff --git a/src/frontends/tensorflow_common/src/op/reshape.cpp b/src/frontends/tensorflow_common/src/op/reshape.cpp index 63e27f1d005..61dd8e4fad7 100644 --- a/src/frontends/tensorflow_common/src/op/reshape.cpp +++ b/src/frontends/tensorflow_common/src/op/reshape.cpp @@ -2,11 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "openvino/op/reshape.hpp" + #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" using namespace std; -using namespace ov::opset8; +using namespace ov::op; namespace ov { namespace frontend { @@ -17,7 +18,7 @@ OutputVector translate_reshape_op(const NodeContext& node) { default_op_checks(node, 2, {"Reshape"}); auto tensor = node.get_input(0); auto shape = node.get_input(1); - auto reshape = make_shared(tensor, shape, false); + auto reshape = make_shared(tensor, shape, false); set_node_name(node.get_name(), reshape); return {reshape}; } diff --git a/src/frontends/tensorflow_common/src/op/reverse.cpp b/src/frontends/tensorflow_common/src/op/reverse.cpp index 15769842129..68d4a82c766 100644 --- a/src/frontends/tensorflow_common/src/op/reverse.cpp +++ b/src/frontends/tensorflow_common/src/op/reverse.cpp @@ -3,23 +3,28 @@ // #include "common_op_table.hpp" -#include "openvino/opsets/opset9.hpp" +#include "openvino/op/broadcast.hpp" +#include "openvino/op/constant.hpp" +#include "openvino/op/gather.hpp" +#include "openvino/op/reverse_sequence.hpp" +#include "openvino/op/squeeze.hpp" +#include "openvino/op/unsqueeze.hpp" using namespace std; using namespace ov; -using namespace ov::opset9; +using namespace ov::op; namespace ov { namespace frontend { namespace tensorflow { namespace op { shared_ptr compute_sequence_lengths(const Output& input_shape, int64_t batch_axis, int64_t seq_axis) { - auto batch_axis_const = make_shared(element::i32, Shape{1}, batch_axis); - auto seq_axis_const = make_shared(element::i32, Shape{1}, seq_axis); - auto gather_axis = make_shared(element::i32, Shape{}, 0); - auto batch_dim = make_shared(input_shape, batch_axis_const, gather_axis); - auto seq_dim = make_shared(input_shape, seq_axis_const, gather_axis); - auto seq_lengths = make_shared(seq_dim, batch_dim); + auto batch_axis_const = make_shared(element::i32, Shape{1}, batch_axis); + auto seq_axis_const = make_shared(element::i32, Shape{1}, seq_axis); + auto gather_axis = make_shared(element::i32, Shape{}, 0); + auto batch_dim = make_shared(input_shape, batch_axis_const, gather_axis); + auto seq_dim = make_shared(input_shape, seq_axis_const, gather_axis); + auto seq_lengths = make_shared(seq_dim, batch_dim); return seq_lengths; } @@ -56,18 +61,20 @@ OutputVector translate_reverse_base_op(const NodeContext& node, auto batched_input = input; if (unsqueeze_axes.size() > 0) { // prepare input to issue auxiliary dimensions for batch - auto unsqueeze_axes_const = make_shared(element::i32, Shape{unsqueeze_axes.size()}, unsqueeze_axes); - batched_input = make_shared(input, unsqueeze_axes_const); + auto unsqueeze_axes_const = + make_shared(element::i32, Shape{unsqueeze_axes.size()}, unsqueeze_axes); + batched_input = make_shared(input, unsqueeze_axes_const); } - auto input_shape = make_shared(batched_input, element::i32); + auto input_shape = make_shared(batched_input, element::i32); auto seq_lenghts = compute_sequence_lengths(input_shape, batch_axis, seq_axis); - auto reverse_sequence = make_shared(batched_input, seq_lenghts, batch_axis, seq_axis)->output(0); + auto reverse_sequence = + make_shared(batched_input, seq_lenghts, batch_axis, seq_axis)->output(0); if (unsqueeze_axes.size() > 0) { // remove earlier added additional dimensions from the result - auto squeeze_axes_const = make_shared(element::i32, Shape{unsqueeze_axes.size()}, unsqueeze_axes); - reverse_sequence = make_shared(reverse_sequence, squeeze_axes_const); + auto squeeze_axes_const = make_shared(element::i32, Shape{unsqueeze_axes.size()}, unsqueeze_axes); + reverse_sequence = make_shared(reverse_sequence, squeeze_axes_const); } set_node_name(node.get_name(), reverse_sequence.get_node_shared_ptr()); diff --git a/src/frontends/tensorflow_common/src/op/reverse_sequence.cpp b/src/frontends/tensorflow_common/src/op/reverse_sequence.cpp index 937651f346e..c406dc6162a 100644 --- a/src/frontends/tensorflow_common/src/op/reverse_sequence.cpp +++ b/src/frontends/tensorflow_common/src/op/reverse_sequence.cpp @@ -2,11 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "openvino/op/reverse_sequence.hpp" + #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" using namespace std; -using namespace ov::opset8; +using namespace ov::op; namespace ov { namespace frontend { @@ -21,7 +22,7 @@ OutputVector translate_reverse_sequence_op(const NodeContext& node) { auto seq_dim = node.get_attribute("seq_dim"); auto batch_dim = node.get_attribute("batch_dim", 0); - auto reverse_sequence = make_shared(input, seq_lengths, batch_dim, seq_dim); + auto reverse_sequence = make_shared(input, seq_lengths, batch_dim, seq_dim); set_node_name(node.get_name(), reverse_sequence); return {reverse_sequence}; } diff --git a/src/frontends/tensorflow_common/src/op/scatter_nd.cpp b/src/frontends/tensorflow_common/src/op/scatter_nd.cpp index d7bd83c4dd2..785e4a7f169 100644 --- a/src/frontends/tensorflow_common/src/op/scatter_nd.cpp +++ b/src/frontends/tensorflow_common/src/op/scatter_nd.cpp @@ -3,11 +3,12 @@ // #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" +#include "openvino/op/broadcast.hpp" +#include "openvino/op/scatter_nd_update.hpp" #include "utils.hpp" using namespace std; -using namespace ov::opset8; +using namespace ov::op; namespace ov { namespace frontend { @@ -20,8 +21,8 @@ OutputVector translate_scatter_nd_op(const NodeContext& node) { auto shape = node.get_input(2); auto input_data = create_same_type_const(updates, vector{0}, Shape{1}); - auto broadcast = make_shared(input_data, shape); - auto scatter_nd = make_shared(broadcast, input_indices, updates); + auto broadcast = make_shared(input_data, shape); + auto scatter_nd = make_shared(broadcast, input_indices, updates); set_node_name(node.get_name(), scatter_nd); return {scatter_nd}; } diff --git a/src/frontends/tensorflow_common/src/op/segment_sum.cpp b/src/frontends/tensorflow_common/src/op/segment_sum.cpp index f64b14bbd30..e4183423b8a 100644 --- a/src/frontends/tensorflow_common/src/op/segment_sum.cpp +++ b/src/frontends/tensorflow_common/src/op/segment_sum.cpp @@ -3,12 +3,18 @@ // #include "common_op_table.hpp" -#include "openvino/opsets/opset9.hpp" +#include "openvino/op/add.hpp" +#include "openvino/op/constant.hpp" +#include "openvino/op/embedding_segments_sum.hpp" +#include "openvino/op/range.hpp" +#include "openvino/op/reduce_max.hpp" +#include "openvino/op/shape_of.hpp" +#include "openvino/op/squeeze.hpp" #include "utils.hpp" using namespace std; using namespace ov; -using namespace ov::opset9; +using namespace ov::op; namespace ov { namespace frontend { @@ -28,18 +34,18 @@ OutputVector translate_segment_sum_op(const NodeContext& node) { auto indices_type = segment_ids.get_element_type(); // 1. compute a number of segments using segment_ids values // do not forget that segment ids are counting from zero - auto reduction_axis = make_shared(element::i32, Shape{1}, 0); - auto num_segments_minus1 = make_shared(segment_ids, reduction_axis, false); - auto num_segments = make_shared(num_segments_minus1, const_one); + auto reduction_axis = make_shared(element::i32, Shape{1}, 0); + auto num_segments_minus1 = make_shared(segment_ids, reduction_axis, false); + auto num_segments = make_shared(num_segments_minus1, const_one); // 2. generate indices input for EmbeddingSegmentSum // that will collect slices consequently from data for each segment - auto squeeze_axis = make_shared(element::i32, Shape{1}, 0); - auto segment_ids_shape = make_shared(segment_ids, indices_type); - auto num_indices = make_shared(segment_ids_shape, squeeze_axis); - auto indices = make_shared(const_zero, num_indices, const_one, indices_type); + auto squeeze_axis = make_shared(element::i32, Shape{1}, 0); + auto segment_ids_shape = make_shared(segment_ids, indices_type); + auto num_indices = make_shared(segment_ids_shape, squeeze_axis); + auto indices = make_shared(const_zero, num_indices, const_one, indices_type); - auto emb_segment_sum = make_shared(data, indices, segment_ids, num_segments); + auto emb_segment_sum = make_shared(data, indices, segment_ids, num_segments); set_node_name(node.get_name(), emb_segment_sum); return {emb_segment_sum}; } diff --git a/src/frontends/tensorflow_common/src/op/select.cpp b/src/frontends/tensorflow_common/src/op/select.cpp index ef759522193..42002cbad82 100644 --- a/src/frontends/tensorflow_common/src/op/select.cpp +++ b/src/frontends/tensorflow_common/src/op/select.cpp @@ -2,12 +2,20 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "openvino/op/select.hpp" + #include "common_op_table.hpp" -#include "openvino/opsets/opset10.hpp" +#include "openvino/op/broadcast.hpp" +#include "openvino/op/concat.hpp" +#include "openvino/op/constant.hpp" +#include "openvino/op/reshape.hpp" +#include "openvino/op/shape_of.hpp" +#include "openvino/op/squeeze.hpp" +#include "openvino/op/subtract.hpp" using namespace std; using namespace ov; -using namespace ov::opset10; +using namespace ov::op; namespace ov { namespace frontend { @@ -18,7 +26,7 @@ OutputVector translate_select_base_op(const NodeContext& node, const Output& x, const Output& y) { // at this point all inputs are NumPy broadcastable - auto select = make_shared(condition, x, y); + auto select = make_shared(condition, x, y); set_node_name(node.get_name(), select); return {select}; } @@ -54,21 +62,21 @@ OutputVector translate_select_op(const NodeContext& node) { // compute number of dimensions to unsqueeze the condition auto cond_rank = compute_subgraph_scalar_rank(condition, element::i32); auto x_rank = compute_subgraph_scalar_rank(x, element::i32); - auto num_new_axes = make_shared(x_rank, cond_rank); + auto num_new_axes = make_shared(x_rank, cond_rank); // generate a new shape for the condition - auto const_one = make_shared(element::i32, Shape{1}, 1); - auto new_subshape = make_shared(const_one, num_new_axes); - auto cond_shape = make_shared(condition, element::i32); + auto const_one = make_shared(element::i32, Shape{1}, 1); + auto new_subshape = make_shared(const_one, num_new_axes); + auto cond_shape = make_shared(condition, element::i32); // use extra dimensions in the begin to avoid concatenation of empty tensors that is not supported by Concat - auto const_1 = make_shared(element::i32, Shape{1}, 1); - auto new_cond_shape = make_shared(OutputVector{const_1, cond_shape, new_subshape}, 0); + auto const_1 = make_shared(element::i32, Shape{1}, 1); + auto new_cond_shape = make_shared(OutputVector{const_1, cond_shape, new_subshape}, 0); // prepare the condition to have the same rank as operands `x` and `y` - auto prep_cond = make_shared(condition, new_cond_shape, false)->output(0); + auto prep_cond = make_shared(condition, new_cond_shape, false)->output(0); // squeeze prep_cond by one extra dimension specially added - auto const_0 = make_shared(element::i32, Shape{1}, 0); - prep_cond = make_shared(prep_cond, const_0); + auto const_0 = make_shared(element::i32, Shape{1}, 0); + prep_cond = make_shared(prep_cond, const_0); return translate_select_base_op(node, prep_cond, x, y); } diff --git a/src/frontends/tensorflow_common/src/op/size.cpp b/src/frontends/tensorflow_common/src/op/size.cpp index 9e503d1cac7..4a56f4d5aba 100644 --- a/src/frontends/tensorflow_common/src/op/size.cpp +++ b/src/frontends/tensorflow_common/src/op/size.cpp @@ -3,11 +3,14 @@ // #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" +#include "openvino/op/constant.hpp" +#include "openvino/op/reduce_prod.hpp" +#include "openvino/op/shape_of.hpp" +#include "openvino/op/unsqueeze.hpp" using namespace std; using namespace ov; -using namespace ov::opset8; +using namespace ov::op; namespace ov { namespace frontend { @@ -23,13 +26,13 @@ ov::OutputVector translate_size_op(const NodeContext& node) { auto out_type = node.get_attribute("out_type", element::i32); // introduce extra dimension in order to compute size in case of a scalar input - auto const_zero = make_shared(element::i32, Shape{1}, 0); - input = make_shared(input, const_zero); + auto const_zero = make_shared(element::i32, Shape{1}, 0); + input = make_shared(input, const_zero); // compute the input tensor size - auto shape_of = make_shared(input, out_type); - auto axis = make_shared(element::i32, Shape{}, 0); - auto size = make_shared(shape_of, axis); + auto shape_of = make_shared(input, out_type); + auto axis = make_shared(element::i32, Shape{}, 0); + auto size = make_shared(shape_of, axis); set_node_name(node.get_name(), size); return {size}; } diff --git a/src/frontends/tensorflow_common/src/op/slice.cpp b/src/frontends/tensorflow_common/src/op/slice.cpp index 24ceaef5b50..a5316a77379 100644 --- a/src/frontends/tensorflow_common/src/op/slice.cpp +++ b/src/frontends/tensorflow_common/src/op/slice.cpp @@ -2,12 +2,19 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "openvino/op/slice.hpp" + #include "common_op_table.hpp" -#include "openvino/opsets/opset8.hpp" +#include "openvino/op/add.hpp" +#include "openvino/op/broadcast.hpp" +#include "openvino/op/convert_like.hpp" +#include "openvino/op/less.hpp" +#include "openvino/op/select.hpp" +#include "openvino/op/shape_of.hpp" #include "utils.hpp" using namespace std; -using namespace ov::opset8; +using namespace ov::op; namespace ov { namespace frontend { @@ -25,25 +32,25 @@ OutputVector translate_slice_op(const NodeContext& node) { auto const_zero = create_same_type_const_scalar(start, 0); // compute stop values in case non-negative sizes - auto stop_pos = make_shared(start, size); + auto stop_pos = make_shared(start, size); // compute stop values in case negative sizes // since TensorFlow supports only -1 among negative sizes // assign stop values to the data shape - Output stop_neg = make_shared(input); - stop_neg = make_shared(stop_neg, size); + Output stop_neg = make_shared(input); + stop_neg = make_shared(stop_neg, size); // select the correct stop value based on a sign of size value - auto negative_sizes_mask = make_shared(size, const_zero); + auto negative_sizes_mask = make_shared(size, const_zero); // TODO: investigate if we can simplify and replace Select with FloorMod operation // like FloorMod(size, input_shape) - auto stop = make_shared