// Copyright (C) 2018-2021 Intel Corporation // SPDX-License-Identifier: Apache-2.0 // #include #include "openvino/op/cum_sum.hpp" #include "base_reference_test.hpp" using namespace reference_tests; using namespace ov; namespace { struct CumSumParams { // Custom axis input and attributes template CumSumParams(const PartialShape& shape, const element::Type& iType, const std::vector& iValues, const std::vector& oValues, const bool execlusive, const bool reverse, const element::Type& axisType, AT axisVal, const PartialShape& axisShape) : execlusive(execlusive), reverse(reverse), axisValue(axisVal), axisShape(axisShape), inShape(shape), axisType(axisType), inType(iType), outType(iType), axisData(CreateTensor(axisType, std::vector {axisVal})), inputData(CreateTensor(iType, iValues)), refData(CreateTensor(iType, oValues)), testDefaults(false) {} // Default axis input and attributes template CumSumParams(const PartialShape& shape, const element::Type& iType, const std::vector& iValues, const std::vector& oValues) : inShape(shape), axisType(element::i32), inType(iType), outType(iType), inputData(CreateTensor(iType, iValues)), refData(CreateTensor(iType, oValues)), testDefaults(true) {} bool execlusive = false; bool reverse = false; int64_t axisValue = 0; PartialShape axisShape; PartialShape inShape; element::Type axisType; element::Type inType; element::Type outType; ov::runtime::Tensor axisData; ov::runtime::Tensor inputData; ov::runtime::Tensor refData; bool testDefaults = false; }; class ReferenceCumSumLayerTest : public testing::TestWithParam, public CommonReferenceTest { public: void SetUp() override { auto params = GetParam(); if (params.testDefaults) { function = CreateFunction(params.inShape, params.inType); inputData = {params.inputData}; refOutData = {params.refData}; } else { function = CreateFunction(params.inShape, params.inType, params.axisShape, params.axisType, params.execlusive, params.reverse); inputData = {params.inputData, params.axisData}; refOutData = {params.refData}; } } static std::string getTestCaseName(const testing::TestParamInfo& obj) { auto param = obj.param; std::ostringstream result; result << "testDefaults=" << param.testDefaults << "_"; result << "axisValue=" << param.axisValue << "_"; result << "execlusive=" << param.execlusive << "_"; result << "reverse=" << param.reverse << "_"; result << "inShape=" << param.inShape << "_"; result << "iType=" << param.inType << "_"; result << "axisType=" << param.axisType << "_"; result << "oType=" << param.outType; return result.str(); } private: static std::shared_ptr CreateFunction(const PartialShape& data_shape, const element::Type& data_type, const PartialShape& axis_shape, const element::Type& axis_type, const bool execlusive, const bool reverse) { const auto data_param = std::make_shared(data_type, data_shape); const auto axis_param = std::make_shared(axis_type, axis_shape); const auto cum_sum = std::make_shared(data_param, axis_param, execlusive, reverse); return std::make_shared(NodeVector {cum_sum}, ParameterVector {data_param, axis_param}); } static std::shared_ptr CreateFunction(const PartialShape& data_shape, const element::Type& data_type) { const auto data_param = std::make_shared(data_type, data_shape); const auto cum_sum = std::make_shared(data_param); return std::make_shared(NodeVector {cum_sum}, ParameterVector {data_param}); } }; TEST_P(ReferenceCumSumLayerTest, CompareWithHardcodedRefs) { Exec(); } template std::vector generateCumSumParams(const element::Type& type) { using T = typename element_type_traits::value_type; std::vector opParams { // Default axis input and attributes CumSumParams(PartialShape {1}, type, std::vector {3}, std::vector {3}), CumSumParams(PartialShape {6}, type, std::vector {1, 2, 3, 4, 5, 6}, std::vector {1, 3, 6, 10, 15, 21}), CumSumParams(PartialShape {2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7}, std::vector {0, 1, 2, 3, 4, 6, 8, 10}), // Custom axis input and attributes CumSumParams(PartialShape {6}, type, std::vector {1, 2, 3, 4, 5, 6}, std::vector {1, 3, 6, 10, 15, 21}, false, false, element::i32, int32_t(0), PartialShape {}), // axis i32 CumSumParams(PartialShape {6}, type, std::vector {1, 2, 3, 4, 5, 6}, std::vector {1, 3, 6, 10, 15, 21}, false, false, element::i64, int64_t(0), PartialShape {}), // axis i64 CumSumParams(PartialShape {6}, type, std::vector {1, 2, 3, 4, 5, 6}, std::vector {21, 20, 18, 15, 11, 6}, false, true, element::i64, int64_t(0), PartialShape {}), CumSumParams(PartialShape {6}, type, std::vector {1, 2, 3, 4, 5, 6}, std::vector {0, 1, 3, 6, 10, 15}, true, false, element::i64, int64_t(0), PartialShape {}), CumSumParams(PartialShape {6}, type, std::vector {1, 2, 3, 4, 5, 6}, std::vector {20, 18, 15, 11, 6, 0}, true, true, element::i64, int64_t(0), PartialShape {}), CumSumParams(PartialShape {2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7}, std::vector {0, 1, 2, 3, 4, 6, 8, 10}, false, false, element::i32, int32_t(0), PartialShape {}), CumSumParams(PartialShape {2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7}, std::vector {4, 6, 8, 10, 4, 5, 6, 7}, false, true, element::i32, int32_t(0), PartialShape {}), CumSumParams(PartialShape {2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7}, std::vector {0, 0, 0, 0, 0, 1, 2, 3}, true, false, element::i32, int32_t(0), PartialShape {}), CumSumParams(PartialShape {2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7}, std::vector {4, 5, 6, 7, 0, 0, 0, 0}, true, true, element::i32, int32_t(0), PartialShape {}), CumSumParams(PartialShape {2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7}, std::vector {0, 1, 3, 6, 4, 9, 15, 22}, false, false, element::i32, int32_t(1), PartialShape {}), CumSumParams(PartialShape {2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7}, std::vector {0, 0, 1, 3, 0, 4, 9, 15}, true, false, element::i32, int32_t(1), PartialShape {}), CumSumParams(PartialShape {2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7}, std::vector {6, 6, 5, 3, 22, 18, 13, 7}, false, true, element::i32, int32_t(1), PartialShape {}), CumSumParams(PartialShape {2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7}, std::vector {6, 5, 3, 0, 18, 13, 7, 0}, true, true, element::i32, int32_t(1), PartialShape {}), CumSumParams(PartialShape {3, 2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}, std::vector {0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 27, 30, 33, 36, 39, 42, 45}, false, false, element::i32, int32_t(0), PartialShape {}), CumSumParams(PartialShape {3, 2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}, std::vector {0, 1, 2, 3, 4, 6, 8, 10, 8, 9, 10, 11, 20, 22, 24, 26, 16, 17, 18, 19, 36, 38, 40, 42}, false, false, element::i32, int32_t(1), PartialShape {}), CumSumParams(PartialShape {3, 2, 4}, type, std::vector {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}, std::vector {0, 1, 3, 6, 4, 9, 15, 22, 8, 17, 27, 38, 12, 25, 39, 54, 16, 33, 51, 70, 20, 41, 63, 86}, false, false, element::i32, int32_t(2), PartialShape {}), }; return opParams; } std::vector generateCumSumCombinedParams() { const std::vector> opTypeParams { generateCumSumParams(element::bf16), generateCumSumParams(element::f16), generateCumSumParams(element::f32), generateCumSumParams(element::i32), generateCumSumParams(element::i64), generateCumSumParams(element::u32), generateCumSumParams(element::i8)}; std::vector combinedParams; std::for_each(opTypeParams.begin(), opTypeParams.end(), [&](std::vector params) { combinedParams.insert(combinedParams.end(), params.begin(), params.end()); }); return combinedParams; } INSTANTIATE_TEST_SUITE_P(smoke_CumSum_With_Hardcoded_Refs, ReferenceCumSumLayerTest, ::testing::ValuesIn(generateCumSumCombinedParams()), ReferenceCumSumLayerTest::getTestCaseName); } // namespace