From 2a9f593d6ca8603175c8fe79a1376893de0f222a Mon Sep 17 00:00:00 2001 From: Lev Proleev Date: Tue, 5 May 2020 17:26:26 +0100 Subject: Fix null ptr dereference in REDUCE_* cpu implementation When asked to reduce across all dimensions, reduce would produce a zero-sized tensor without dimensions and cause segmentation fault in the implementation. The change fixes the bug by making the op output a tensor of size [1] in this case. Also, updated the bug to clarify this behaviour. Bug: 155508675 Test: NNTest_static Change-Id: Ie98d8fa2e508255fd50f6bd8184dc323ba90fac8 --- nn/runtime/include/NeuralNetworks.h | 12 ++ .../spec_V1_2/reduce_all_b155508675.example.cpp | 73 +++++++++ .../spec_V1_2/reduce_any_b155508675.example.cpp | 73 +++++++++ .../spec_V1_2/reduce_max_b155508675.example.cpp | 174 +++++++++++++++++++++ .../spec_V1_2/reduce_min_b155508675.example.cpp | 174 +++++++++++++++++++++ .../spec_V1_2/reduce_prod_b155508675.example.cpp | 174 +++++++++++++++++++++ .../spec_V1_2/reduce_sum_b155508675.example.cpp | 174 +++++++++++++++++++++ .../test/specs/V1_2/reduce_all_b155508675.mod.py | 29 ++++ .../test/specs/V1_2/reduce_any_b155508675.mod.py | 29 ++++ .../test/specs/V1_2/reduce_max_b155508675.mod.py | 29 ++++ .../test/specs/V1_2/reduce_min_b155508675.mod.py | 29 ++++ .../test/specs/V1_2/reduce_prod_b155508675.mod.py | 29 ++++ .../test/specs/V1_2/reduce_sum_b155508675.mod.py | 29 ++++ 13 files changed, 1028 insertions(+) create mode 100644 nn/runtime/test/generated/spec_V1_2/reduce_all_b155508675.example.cpp create mode 100644 nn/runtime/test/generated/spec_V1_2/reduce_any_b155508675.example.cpp create mode 100644 nn/runtime/test/generated/spec_V1_2/reduce_max_b155508675.example.cpp create mode 100644 nn/runtime/test/generated/spec_V1_2/reduce_min_b155508675.example.cpp create mode 100644 nn/runtime/test/generated/spec_V1_2/reduce_prod_b155508675.example.cpp create mode 100644 nn/runtime/test/generated/spec_V1_2/reduce_sum_b155508675.example.cpp create mode 100644 nn/runtime/test/specs/V1_2/reduce_all_b155508675.mod.py create mode 100644 nn/runtime/test/specs/V1_2/reduce_any_b155508675.mod.py create mode 100644 nn/runtime/test/specs/V1_2/reduce_max_b155508675.mod.py create mode 100644 nn/runtime/test/specs/V1_2/reduce_min_b155508675.mod.py create mode 100644 nn/runtime/test/specs/V1_2/reduce_prod_b155508675.mod.py create mode 100644 nn/runtime/test/specs/V1_2/reduce_sum_b155508675.mod.py (limited to 'nn/runtime') diff --git a/nn/runtime/include/NeuralNetworks.h b/nn/runtime/include/NeuralNetworks.h index 8911eaf52..82c668371 100644 --- a/nn/runtime/include/NeuralNetworks.h +++ b/nn/runtime/include/NeuralNetworks.h @@ -4381,6 +4381,8 @@ typedef enum { * * Outputs: * * 0: A tensor of the same {@link OperandCode} as input0. + * If all dimensions are reduced and keep_dims is false, the output + * shape is [1]. * * Available since API level 29. */ @@ -4408,6 +4410,8 @@ typedef enum { * * Outputs: * * 0: A tensor of the same {@link OperandCode} as input0. + * If all dimensions are reduced and keep_dims is false, the output + * shape is [1]. * * Available since API level 29. */ @@ -4438,6 +4442,8 @@ typedef enum { * * Outputs: * * 0: A tensor of the same {@link OperandCode} as input0. + * If all dimensions are reduced and keep_dims is false, the output + * shape is [1]. * For a {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} and * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM_SIGNED} tensor, * the scale and zeroPoint must be the same as input0. @@ -4471,6 +4477,8 @@ typedef enum { * * Outputs: * * 0: A tensor of the same {@link OperandCode} as input0. + * If all dimensions are reduced and keep_dims is false, the output + * shape is [1]. * For a {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM} and * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM_SIGNED} tensor, * the scale and zeroPoint must be the same as input0. @@ -4501,6 +4509,8 @@ typedef enum { * * Outputs: * * 0: A tensor of the same {@link OperandCode} as input0. + * If all dimensions are reduced and keep_dims is false, the output + * shape is [1]. * * Available since API level 29. */ @@ -4528,6 +4538,8 @@ typedef enum { * * Outputs: * * 0: A tensor of the same {@link OperandCode} as input0. + * If all dimensions are reduced and keep_dims is false, the output + * shape is [1]. * * Available since API level 29. */ diff --git a/nn/runtime/test/generated/spec_V1_2/reduce_all_b155508675.example.cpp b/nn/runtime/test/generated/spec_V1_2/reduce_all_b155508675.example.cpp new file mode 100644 index 000000000..10be3a0d5 --- /dev/null +++ b/nn/runtime/test/generated/spec_V1_2/reduce_all_b155508675.example.cpp @@ -0,0 +1,73 @@ +// Generated from reduce_all_b155508675.mod.py +// DO NOT EDIT +// clang-format off +#include "TestHarness.h" +using namespace test_helper; + +namespace generated_tests::reduce_all_b155508675 { + +const TestModel& get_test_model() { + static TestModel model = { + .expectFailure = false, + .expectedMultinomialDistributionTolerance = 0, + .isRelaxed = false, + .main = { + .inputIndexes = {0}, + .operands = {{ // op1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_INPUT, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_BOOL8, + .zeroPoint = 0 + }, { // param + .channelQuant = {}, + .data = TestBuffer::createFromVector({0, 1, 2}), + .dimensions = {3}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_INT32, + .zeroPoint = 0 + }, { // param1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::BOOL, + .zeroPoint = 0 + }, { // op2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_OUTPUT, + .numberOfConsumers = 0, + .scale = 0.0f, + .type = TestOperandType::TENSOR_BOOL8, + .zeroPoint = 0 + }}, + .operations = {{ + .inputs = {0, 1, 2}, + .outputs = {3}, + .type = TestOperationType::REDUCE_ALL + }}, + .outputIndexes = {3} + }, + .minSupportedVersion = TestHalVersion::V1_2, + .referenced = {} + }; + return model; +} + +const auto dummy_test_model = TestModelManager::get().add("reduce_all_b155508675", get_test_model()); + +} // namespace generated_tests::reduce_all_b155508675 + diff --git a/nn/runtime/test/generated/spec_V1_2/reduce_any_b155508675.example.cpp b/nn/runtime/test/generated/spec_V1_2/reduce_any_b155508675.example.cpp new file mode 100644 index 000000000..603bd51c2 --- /dev/null +++ b/nn/runtime/test/generated/spec_V1_2/reduce_any_b155508675.example.cpp @@ -0,0 +1,73 @@ +// Generated from reduce_any_b155508675.mod.py +// DO NOT EDIT +// clang-format off +#include "TestHarness.h" +using namespace test_helper; + +namespace generated_tests::reduce_any_b155508675 { + +const TestModel& get_test_model() { + static TestModel model = { + .expectFailure = false, + .expectedMultinomialDistributionTolerance = 0, + .isRelaxed = false, + .main = { + .inputIndexes = {0}, + .operands = {{ // op1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_INPUT, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_BOOL8, + .zeroPoint = 0 + }, { // param + .channelQuant = {}, + .data = TestBuffer::createFromVector({0, 1, 2}), + .dimensions = {3}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_INT32, + .zeroPoint = 0 + }, { // param1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::BOOL, + .zeroPoint = 0 + }, { // op2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_OUTPUT, + .numberOfConsumers = 0, + .scale = 0.0f, + .type = TestOperandType::TENSOR_BOOL8, + .zeroPoint = 0 + }}, + .operations = {{ + .inputs = {0, 1, 2}, + .outputs = {3}, + .type = TestOperationType::REDUCE_ANY + }}, + .outputIndexes = {3} + }, + .minSupportedVersion = TestHalVersion::V1_2, + .referenced = {} + }; + return model; +} + +const auto dummy_test_model = TestModelManager::get().add("reduce_any_b155508675", get_test_model()); + +} // namespace generated_tests::reduce_any_b155508675 + diff --git a/nn/runtime/test/generated/spec_V1_2/reduce_max_b155508675.example.cpp b/nn/runtime/test/generated/spec_V1_2/reduce_max_b155508675.example.cpp new file mode 100644 index 000000000..17af9128d --- /dev/null +++ b/nn/runtime/test/generated/spec_V1_2/reduce_max_b155508675.example.cpp @@ -0,0 +1,174 @@ +// Generated from reduce_max_b155508675.mod.py +// DO NOT EDIT +// clang-format off +#include "TestHarness.h" +using namespace test_helper; + +namespace generated_tests::reduce_max_b155508675 { + +const TestModel& get_test_model() { + static TestModel model = { + .expectFailure = false, + .expectedMultinomialDistributionTolerance = 0, + .isRelaxed = false, + .main = { + .inputIndexes = {0}, + .operands = {{ // op1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_INPUT, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param + .channelQuant = {}, + .data = TestBuffer::createFromVector({0, 1, 2}), + .dimensions = {3}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_INT32, + .zeroPoint = 0 + }, { // param1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::BOOL, + .zeroPoint = 0 + }, { // op2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_OUTPUT, + .numberOfConsumers = 0, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }}, + .operations = {{ + .inputs = {0, 1, 2}, + .outputs = {3}, + .type = TestOperationType::REDUCE_MAX + }}, + .outputIndexes = {3} + }, + .minSupportedVersion = TestHalVersion::V1_2, + .referenced = {} + }; + return model; +} + +const auto dummy_test_model = TestModelManager::get().add("reduce_max_b155508675", get_test_model()); + +} // namespace generated_tests::reduce_max_b155508675 + +namespace generated_tests::reduce_max_b155508675 { + +const TestModel& get_test_model_all_inputs_as_internal() { + static TestModel model = { + .expectFailure = false, + .expectedMultinomialDistributionTolerance = 0, + .isRelaxed = false, + .main = { + .inputIndexes = {4}, + .operands = {{ // op1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::TEMPORARY_VARIABLE, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param + .channelQuant = {}, + .data = TestBuffer::createFromVector({0, 1, 2}), + .dimensions = {3}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_INT32, + .zeroPoint = 0 + }, { // param1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::BOOL, + .zeroPoint = 0 + }, { // op2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_OUTPUT, + .numberOfConsumers = 0, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // op1_new + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_INPUT, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // dummy + .channelQuant = {}, + .data = TestBuffer::createFromVector({0.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({0}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::INT32, + .zeroPoint = 0 + }}, + .operations = {{ + .inputs = {4, 5, 6}, + .outputs = {0}, + .type = TestOperationType::ADD + }, { + .inputs = {0, 1, 2}, + .outputs = {3}, + .type = TestOperationType::REDUCE_MAX + }}, + .outputIndexes = {3} + }, + .minSupportedVersion = TestHalVersion::V1_2, + .referenced = {} + }; + return model; +} + +const auto dummy_test_model_all_inputs_as_internal = TestModelManager::get().add("reduce_max_b155508675_all_inputs_as_internal", get_test_model_all_inputs_as_internal()); + +} // namespace generated_tests::reduce_max_b155508675 + diff --git a/nn/runtime/test/generated/spec_V1_2/reduce_min_b155508675.example.cpp b/nn/runtime/test/generated/spec_V1_2/reduce_min_b155508675.example.cpp new file mode 100644 index 000000000..170554e71 --- /dev/null +++ b/nn/runtime/test/generated/spec_V1_2/reduce_min_b155508675.example.cpp @@ -0,0 +1,174 @@ +// Generated from reduce_min_b155508675.mod.py +// DO NOT EDIT +// clang-format off +#include "TestHarness.h" +using namespace test_helper; + +namespace generated_tests::reduce_min_b155508675 { + +const TestModel& get_test_model() { + static TestModel model = { + .expectFailure = false, + .expectedMultinomialDistributionTolerance = 0, + .isRelaxed = false, + .main = { + .inputIndexes = {0}, + .operands = {{ // op1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_INPUT, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param + .channelQuant = {}, + .data = TestBuffer::createFromVector({0, 1, 2}), + .dimensions = {3}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_INT32, + .zeroPoint = 0 + }, { // param1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::BOOL, + .zeroPoint = 0 + }, { // op2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_OUTPUT, + .numberOfConsumers = 0, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }}, + .operations = {{ + .inputs = {0, 1, 2}, + .outputs = {3}, + .type = TestOperationType::REDUCE_MIN + }}, + .outputIndexes = {3} + }, + .minSupportedVersion = TestHalVersion::V1_2, + .referenced = {} + }; + return model; +} + +const auto dummy_test_model = TestModelManager::get().add("reduce_min_b155508675", get_test_model()); + +} // namespace generated_tests::reduce_min_b155508675 + +namespace generated_tests::reduce_min_b155508675 { + +const TestModel& get_test_model_all_inputs_as_internal() { + static TestModel model = { + .expectFailure = false, + .expectedMultinomialDistributionTolerance = 0, + .isRelaxed = false, + .main = { + .inputIndexes = {4}, + .operands = {{ // op1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::TEMPORARY_VARIABLE, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param + .channelQuant = {}, + .data = TestBuffer::createFromVector({0, 1, 2}), + .dimensions = {3}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_INT32, + .zeroPoint = 0 + }, { // param1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::BOOL, + .zeroPoint = 0 + }, { // op2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_OUTPUT, + .numberOfConsumers = 0, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // op1_new + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_INPUT, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // dummy + .channelQuant = {}, + .data = TestBuffer::createFromVector({0.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({0}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::INT32, + .zeroPoint = 0 + }}, + .operations = {{ + .inputs = {4, 5, 6}, + .outputs = {0}, + .type = TestOperationType::ADD + }, { + .inputs = {0, 1, 2}, + .outputs = {3}, + .type = TestOperationType::REDUCE_MIN + }}, + .outputIndexes = {3} + }, + .minSupportedVersion = TestHalVersion::V1_2, + .referenced = {} + }; + return model; +} + +const auto dummy_test_model_all_inputs_as_internal = TestModelManager::get().add("reduce_min_b155508675_all_inputs_as_internal", get_test_model_all_inputs_as_internal()); + +} // namespace generated_tests::reduce_min_b155508675 + diff --git a/nn/runtime/test/generated/spec_V1_2/reduce_prod_b155508675.example.cpp b/nn/runtime/test/generated/spec_V1_2/reduce_prod_b155508675.example.cpp new file mode 100644 index 000000000..8fcb2fcd1 --- /dev/null +++ b/nn/runtime/test/generated/spec_V1_2/reduce_prod_b155508675.example.cpp @@ -0,0 +1,174 @@ +// Generated from reduce_prod_b155508675.mod.py +// DO NOT EDIT +// clang-format off +#include "TestHarness.h" +using namespace test_helper; + +namespace generated_tests::reduce_prod_b155508675 { + +const TestModel& get_test_model() { + static TestModel model = { + .expectFailure = false, + .expectedMultinomialDistributionTolerance = 0, + .isRelaxed = false, + .main = { + .inputIndexes = {0}, + .operands = {{ // op1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_INPUT, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param + .channelQuant = {}, + .data = TestBuffer::createFromVector({0, 1, 2}), + .dimensions = {3}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_INT32, + .zeroPoint = 0 + }, { // param1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::BOOL, + .zeroPoint = 0 + }, { // op2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_OUTPUT, + .numberOfConsumers = 0, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }}, + .operations = {{ + .inputs = {0, 1, 2}, + .outputs = {3}, + .type = TestOperationType::REDUCE_PROD + }}, + .outputIndexes = {3} + }, + .minSupportedVersion = TestHalVersion::V1_2, + .referenced = {} + }; + return model; +} + +const auto dummy_test_model = TestModelManager::get().add("reduce_prod_b155508675", get_test_model()); + +} // namespace generated_tests::reduce_prod_b155508675 + +namespace generated_tests::reduce_prod_b155508675 { + +const TestModel& get_test_model_all_inputs_as_internal() { + static TestModel model = { + .expectFailure = false, + .expectedMultinomialDistributionTolerance = 0, + .isRelaxed = false, + .main = { + .inputIndexes = {4}, + .operands = {{ // op1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::TEMPORARY_VARIABLE, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param + .channelQuant = {}, + .data = TestBuffer::createFromVector({0, 1, 2}), + .dimensions = {3}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_INT32, + .zeroPoint = 0 + }, { // param1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::BOOL, + .zeroPoint = 0 + }, { // op2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_OUTPUT, + .numberOfConsumers = 0, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // op1_new + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_INPUT, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // dummy + .channelQuant = {}, + .data = TestBuffer::createFromVector({0.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({0}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::INT32, + .zeroPoint = 0 + }}, + .operations = {{ + .inputs = {4, 5, 6}, + .outputs = {0}, + .type = TestOperationType::ADD + }, { + .inputs = {0, 1, 2}, + .outputs = {3}, + .type = TestOperationType::REDUCE_PROD + }}, + .outputIndexes = {3} + }, + .minSupportedVersion = TestHalVersion::V1_2, + .referenced = {} + }; + return model; +} + +const auto dummy_test_model_all_inputs_as_internal = TestModelManager::get().add("reduce_prod_b155508675_all_inputs_as_internal", get_test_model_all_inputs_as_internal()); + +} // namespace generated_tests::reduce_prod_b155508675 + diff --git a/nn/runtime/test/generated/spec_V1_2/reduce_sum_b155508675.example.cpp b/nn/runtime/test/generated/spec_V1_2/reduce_sum_b155508675.example.cpp new file mode 100644 index 000000000..e210964ca --- /dev/null +++ b/nn/runtime/test/generated/spec_V1_2/reduce_sum_b155508675.example.cpp @@ -0,0 +1,174 @@ +// Generated from reduce_sum_b155508675.mod.py +// DO NOT EDIT +// clang-format off +#include "TestHarness.h" +using namespace test_helper; + +namespace generated_tests::reduce_sum_b155508675 { + +const TestModel& get_test_model() { + static TestModel model = { + .expectFailure = false, + .expectedMultinomialDistributionTolerance = 0, + .isRelaxed = false, + .main = { + .inputIndexes = {0}, + .operands = {{ // op1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_INPUT, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param + .channelQuant = {}, + .data = TestBuffer::createFromVector({0, 1, 2}), + .dimensions = {3}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_INT32, + .zeroPoint = 0 + }, { // param1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::BOOL, + .zeroPoint = 0 + }, { // op2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_OUTPUT, + .numberOfConsumers = 0, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }}, + .operations = {{ + .inputs = {0, 1, 2}, + .outputs = {3}, + .type = TestOperationType::REDUCE_SUM + }}, + .outputIndexes = {3} + }, + .minSupportedVersion = TestHalVersion::V1_2, + .referenced = {} + }; + return model; +} + +const auto dummy_test_model = TestModelManager::get().add("reduce_sum_b155508675", get_test_model()); + +} // namespace generated_tests::reduce_sum_b155508675 + +namespace generated_tests::reduce_sum_b155508675 { + +const TestModel& get_test_model_all_inputs_as_internal() { + static TestModel model = { + .expectFailure = false, + .expectedMultinomialDistributionTolerance = 0, + .isRelaxed = false, + .main = { + .inputIndexes = {4}, + .operands = {{ // op1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::TEMPORARY_VARIABLE, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param + .channelQuant = {}, + .data = TestBuffer::createFromVector({0, 1, 2}), + .dimensions = {3}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_INT32, + .zeroPoint = 0 + }, { // param1 + .channelQuant = {}, + .data = TestBuffer::createFromVector({false}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::BOOL, + .zeroPoint = 0 + }, { // op2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_OUTPUT, + .numberOfConsumers = 0, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // op1_new + .channelQuant = {}, + .data = TestBuffer::createFromVector({3.0f}), + .dimensions = {1, 1, 1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::SUBGRAPH_INPUT, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // dummy + .channelQuant = {}, + .data = TestBuffer::createFromVector({0.0f}), + .dimensions = {1}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::TENSOR_FLOAT32, + .zeroPoint = 0 + }, { // param2 + .channelQuant = {}, + .data = TestBuffer::createFromVector({0}), + .dimensions = {}, + .isIgnored = false, + .lifetime = TestOperandLifeTime::CONSTANT_COPY, + .numberOfConsumers = 1, + .scale = 0.0f, + .type = TestOperandType::INT32, + .zeroPoint = 0 + }}, + .operations = {{ + .inputs = {4, 5, 6}, + .outputs = {0}, + .type = TestOperationType::ADD + }, { + .inputs = {0, 1, 2}, + .outputs = {3}, + .type = TestOperationType::REDUCE_SUM + }}, + .outputIndexes = {3} + }, + .minSupportedVersion = TestHalVersion::V1_2, + .referenced = {} + }; + return model; +} + +const auto dummy_test_model_all_inputs_as_internal = TestModelManager::get().add("reduce_sum_b155508675_all_inputs_as_internal", get_test_model_all_inputs_as_internal()); + +} // namespace generated_tests::reduce_sum_b155508675 + diff --git a/nn/runtime/test/specs/V1_2/reduce_all_b155508675.mod.py b/nn/runtime/test/specs/V1_2/reduce_all_b155508675.mod.py new file mode 100644 index 000000000..f0fb40eda --- /dev/null +++ b/nn/runtime/test/specs/V1_2/reduce_all_b155508675.mod.py @@ -0,0 +1,29 @@ +# +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Model operands +op1 = Input("op1", ["TENSOR_BOOL8", [1, 1, 1]]) +op2 = Output("op2", ["TENSOR_BOOL8", [1]]) + +# Model operations +model = Model() +model.Operation("REDUCE_ALL", op1, [0, 1, 2], False).To(op2) + +# Example +Example({ + op1: [False], + op2: [False], +}, model=model) diff --git a/nn/runtime/test/specs/V1_2/reduce_any_b155508675.mod.py b/nn/runtime/test/specs/V1_2/reduce_any_b155508675.mod.py new file mode 100644 index 000000000..67e955efc --- /dev/null +++ b/nn/runtime/test/specs/V1_2/reduce_any_b155508675.mod.py @@ -0,0 +1,29 @@ +# +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Model operands +op1 = Input("op1", ["TENSOR_BOOL8", [1, 1, 1]]) +op2 = Output("op2", ["TENSOR_BOOL8", [1]]) + +# Model operations +model = Model() +model.Operation("REDUCE_ANY", op1, [0, 1, 2], False).To(op2) + +# Example +Example({ + op1: [False], + op2: [False], +}, model=model) diff --git a/nn/runtime/test/specs/V1_2/reduce_max_b155508675.mod.py b/nn/runtime/test/specs/V1_2/reduce_max_b155508675.mod.py new file mode 100644 index 000000000..72c8e6531 --- /dev/null +++ b/nn/runtime/test/specs/V1_2/reduce_max_b155508675.mod.py @@ -0,0 +1,29 @@ +# +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Model operands +op1 = Input("op1", ["TENSOR_FLOAT32", [1, 1, 1]]) +op2 = Output("op2", ["TENSOR_FLOAT32", [1]]) + +# Model operations +model = Model() +model.Operation("REDUCE_MAX", op1, [0, 1, 2], False).To(op2) + +# Example +Example({ + op1: [3.0], + op2: [3.0], +}, model=model) diff --git a/nn/runtime/test/specs/V1_2/reduce_min_b155508675.mod.py b/nn/runtime/test/specs/V1_2/reduce_min_b155508675.mod.py new file mode 100644 index 000000000..0fb9c8ff9 --- /dev/null +++ b/nn/runtime/test/specs/V1_2/reduce_min_b155508675.mod.py @@ -0,0 +1,29 @@ +# +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Model operands +op1 = Input("op1", ["TENSOR_FLOAT32", [1, 1, 1]]) +op2 = Output("op2", ["TENSOR_FLOAT32", [1]]) + +# Model operations +model = Model() +model.Operation("REDUCE_MIN", op1, [0, 1, 2], False).To(op2) + +# Example +Example({ + op1: [3.0], + op2: [3.0], +}, model=model) diff --git a/nn/runtime/test/specs/V1_2/reduce_prod_b155508675.mod.py b/nn/runtime/test/specs/V1_2/reduce_prod_b155508675.mod.py new file mode 100644 index 000000000..212c9b3d8 --- /dev/null +++ b/nn/runtime/test/specs/V1_2/reduce_prod_b155508675.mod.py @@ -0,0 +1,29 @@ +# +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Model operands +op1 = Input("op1", ["TENSOR_FLOAT32", [1, 1, 1]]) +op2 = Output("op2", ["TENSOR_FLOAT32", [1]]) + +# Model operations +model = Model() +model.Operation("REDUCE_PROD", op1, [0, 1, 2], False).To(op2) + +# Example +Example({ + op1: [3.0], + op2: [3.0], +}, model=model) diff --git a/nn/runtime/test/specs/V1_2/reduce_sum_b155508675.mod.py b/nn/runtime/test/specs/V1_2/reduce_sum_b155508675.mod.py new file mode 100644 index 000000000..a2cb79df6 --- /dev/null +++ b/nn/runtime/test/specs/V1_2/reduce_sum_b155508675.mod.py @@ -0,0 +1,29 @@ +# +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Model operands +op1 = Input("op1", ["TENSOR_FLOAT32", [1, 1, 1]]) +op2 = Output("op2", ["TENSOR_FLOAT32", [1]]) + +# Model operations +model = Model() +model.Operation("REDUCE_SUM", op1, [0, 1, 2], False).To(op2) + +# Example +Example({ + op1: [3.0], + op2: [3.0], +}, model=model) -- cgit v1.2.3