text: // Copyright (C) 2018-2021 Intel Corporation
  // SPDX-License-Identifier: Apache-2.0
  //
  
  #include "gtest/gtest.h"
  #include "ngraph/ngraph.hpp"
  #include "util/all_close.hpp"
  #include "util/all_close_f.hpp"
  #include "util/known_element_types.hpp"
  #include "util/ndarray.hpp"
  #include "util/test_control.hpp"
  #include "util/test_tools.hpp"
  
  using namespace std;
  using namespace ngraph;
  
  static string s_manifest = "${MANIFEST}";
  
  // ----------------------- keep dims = false ----------------------- //
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_to_scalar)
  {
      Shape shape{2, 2};
      auto A = make_shared<op::Parameter>(element::f32, shape);
      auto axes = make_shared<op::Constant>(element::i32, Shape{2}, vector<int32_t>{0, 1});
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape);
      copy_data(a, vector<float>{1, 2, 3, 4});
      auto result = backend->create_tensor(element::f32, Shape{});
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_to_scalar_int8)
  {
      Shape shape{2, 2};
      auto A = make_shared<op::Parameter>(element::i8, shape);
      auto axes = make_shared<op::Constant>(element::i32, Shape{2}, vector<int32_t>{0, 1});
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::i8, shape);
      copy_data(a, vector<int8_t>{1, 2, 3, 4});
      auto result = backend->create_tensor(element::i8, Shape{});
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_EQ((vector<int8_t>{1}), read_vector<int8_t>(result));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_matrix_columns)
  {
      Shape shape_a{3, 2};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{2};
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 0);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1, 2, 3, 4, 5, 6});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1, 2}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_matrix_rows)
  {
      Shape shape_a{3, 2};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{3};
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 1);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1, 2, 3, 4, 5, 6});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1, 3, 5}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_matrix_rows_int32)
  {
      Shape shape_a{3, 2};
      auto A = make_shared<op::Parameter>(element::i32, shape_a);
      Shape shape_rt{3};
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 1);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::i32, shape_a);
      copy_data(a, vector<int32_t>{1, 2, 3, 4, 5, 6});
      auto result = backend->create_tensor(element::i32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_EQ((vector<int32_t>{1, 3, 5}), read_vector<int32_t>(result));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_3d_to_matrix_most_sig)
  {
      Shape shape_a{3, 3, 3};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{3, 3};
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 0);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14,
                                 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f((vector<float>{1, 2, 3, 4, 5, 6, 7, 8, 9}),
                                    read_vector<float>(result),
                                    MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_3d_to_matrix_least_sig)
  {
      Shape shape_a{3, 3, 3};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{3, 3};
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 2);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14,
                                 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f((vector<float>{1, 4, 7, 10, 13, 16, 19, 22, 25}),
                                    read_vector<float>(result),
                                    MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_3d_to_vector)
  {
      Shape shape_a{3, 3, 3};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{3};
      auto axes = make_shared<op::Constant>(element::i32, Shape{2}, vector<int32_t>{0, 1});
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14,
                                 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1, 2, 3}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_3d_to_scalar)
  {
      Shape shape_a{3, 3, 3};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{};
      auto axes = make_shared<op::Constant>(element::i32, Shape{3}, vector<int32_t>{0, 1, 2});
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1,  2,  3,  4,  5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                                 13, 12, 11, 10, 9, 8, 7, 6, 5, 4,  3,  2,  1});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_3d_to_scalar_int32)
  {
      Shape shape_a{3, 3, 3};
      auto A = make_shared<op::Parameter>(element::i32, shape_a);
      Shape shape_rt{};
      auto axes = make_shared<op::Constant>(element::i32, Shape{3}, vector<int32_t>{0, 1, 2});
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::i32, shape_a);
      copy_data(a, vector<int32_t>{1,  2,  3,  4,  5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                                   13, 12, 11, 10, 9, 8, 7, 6, 5, 4,  3,  2,  1});
      auto result = backend->create_tensor(element::i32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_EQ((vector<int32_t>{1}), read_vector<int32_t>(result));
  }
  
  // ----------------------- keep dims = true ----------------------- //
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_to_scalar)
  {
      Shape shape{2, 2};
      auto A = make_shared<op::Parameter>(element::f32, shape);
      auto axes = make_shared<op::Constant>(element::i32, Shape{2}, vector<int32_t>{0, 1});
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape);
      copy_data(a, vector<float>{1, 2, 3, 4});
      auto result = backend->create_tensor(element::f32, Shape{1, 1});
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_to_scalar_int8)
  {
      Shape shape{2, 2};
      auto A = make_shared<op::Parameter>(element::i8, shape);
      auto axes = make_shared<op::Constant>(element::i32, Shape{2}, vector<int32_t>{0, 1});
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::i8, shape);
      copy_data(a, vector<int8_t>{1, 2, 3, 4});
      auto result = backend->create_tensor(element::i8, Shape{1, 1});
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_EQ((vector<int8_t>{1}), read_vector<int8_t>(result));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_matrix_columns)
  {
      Shape shape_a{3, 2};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{1, 2};
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 0);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1, 2, 3, 4, 5, 6});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1, 2}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_matrix_rows)
  {
      Shape shape_a{3, 2};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{3, 1};
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 1);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1, 2, 3, 4, 5, 6});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1, 3, 5}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_matrix_rows_int32)
  {
      Shape shape_a{3, 2};
      auto A = make_shared<op::Parameter>(element::i32, shape_a);
      Shape shape_rt{3, 1};
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 1);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::i32, shape_a);
      copy_data(a, vector<int32_t>{1, 2, 3, 4, 5, 6});
      auto result = backend->create_tensor(element::i32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_EQ((vector<int32_t>{1, 3, 5}), read_vector<int32_t>(result));
  }
  
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_3d_to_matrix_most_sig)
  {
      Shape shape_a{3, 3, 3};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{1, 3, 3};
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 0);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14,
                                 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f((vector<float>{1, 2, 3, 4, 5, 6, 7, 8, 9}),
                                    read_vector<float>(result),
                                    MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_3d_to_matrix_least_sig)
  {
      Shape shape_a{3, 3, 3};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{3, 3, 1};
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 2);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14,
                                 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f((vector<float>{1, 4, 7, 10, 13, 16, 19, 22, 25}),
                                    read_vector<float>(result),
                                    MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_3d_to_vector)
  {
      Shape shape_a{3, 3, 3};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{1, 1, 3};
      auto axes = make_shared<op::Constant>(element::i32, Shape{2}, vector<int32_t>{0, 1});
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14,
                                 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1, 2, 3}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_3d_to_scalar)
  {
      Shape shape_a{3, 3, 3};
      auto A = make_shared<op::Parameter>(element::f32, shape_a);
      Shape shape_rt{1, 1, 1};
      auto axes = make_shared<op::Constant>(element::i32, Shape{3}, vector<int32_t>{0, 1, 2});
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1,  2,  3,  4,  5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                                 13, 12, 11, 10, 9, 8, 7, 6, 5, 4,  3,  2,  1});
      auto result = backend->create_tensor(element::f32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_3d_to_scalar_int32)
  {
      Shape shape_a{3, 3, 3};
      auto A = make_shared<op::Parameter>(element::i32, shape_a);
      Shape shape_rt{1, 1, 1};
      auto axes = make_shared<op::Constant>(element::i32, Shape{3}, vector<int32_t>{0, 1, 2});
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}");
  
      // Create some tensors for input/output
      auto a = backend->create_tensor(element::i32, shape_a);
      copy_data(a, vector<int32_t>{1,  2,  3,  4,  5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                                   13, 12, 11, 10, 9, 8, 7, 6, 5, 4,  3,  2,  1});
      auto result = backend->create_tensor(element::i32, shape_rt);
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_EQ((vector<int32_t>{1}), read_vector<int32_t>(result));
  }
  
  // Dynamic
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_matrix_columns_dynamic)
  {
      auto A = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 0);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}", true);
  
      // Create some tensors for input/output
      Shape shape_a{3, 2};
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1, 2, 3, 4, 5, 6});
      auto result = backend->create_dynamic_tensor(element::f32, PartialShape::dynamic());
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1, 2}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_matrix_rows_dynamic)
  {
      auto A = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 1);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, false), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}", true);
  
      // Create some tensors for input/output
      Shape shape_a{3, 2};
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1, 2, 3, 4, 5, 6});
      auto result = backend->create_dynamic_tensor(element::f32, PartialShape::dynamic());
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1, 3, 5}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_matrix_columns_dynamic)
  {
      auto A = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 0);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}", true);
  
      // Create some tensors for input/output
      Shape shape_a{3, 2};
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1, 2, 3, 4, 5, 6});
      auto result = backend->create_dynamic_tensor(element::f32, PartialShape::dynamic());
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1, 2}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  
  NGRAPH_TEST(${BACKEND_NAME}, reduce_min_keep_matrix_rows_dynamic)
  {
      auto A = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
      auto axes = make_shared<op::Constant>(element::i32, Shape{}, 1);
      auto f =
          make_shared<Function>(make_shared<op::v1::ReduceMin>(A, axes, true), ParameterVector{A});
  
      auto backend = runtime::Backend::create("${BACKEND_NAME}", true);
  
      // Create some tensors for input/output
      Shape shape_a{3, 2};
      auto a = backend->create_tensor(element::f32, shape_a);
      copy_data(a, vector<float>{1, 2, 3, 4, 5, 6});
      auto result = backend->create_dynamic_tensor(element::f32, PartialShape::dynamic());
  
      auto handle = backend->compile(f);
      handle->call_with_validate({result}, {a});
      EXPECT_TRUE(test::all_close_f(
          (vector<float>{1, 3, 5}), read_vector<float>(result), MIN_FLOAT_TOLERANCE_BITS));
  }
  