summaryrefslogtreecommitdiff
path: root/nn/runtime
diff options
context:
space:
mode:
authorLev Proleev <levp@google.com>2020-05-15 10:28:38 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-05-15 10:28:38 +0000
commit8a04de27835fab537106a0852daa730696555797 (patch)
treebb9c83fd8248ddd901fc5d3e6e9e3441c30a5804 /nn/runtime
parente87eb356123eca6200e3a58eda82df38b0a68b02 (diff)
parent2a9f593d6ca8603175c8fe79a1376893de0f222a (diff)
downloadml-8a04de27835fab537106a0852daa730696555797.tar.gz
Merge "Fix null ptr dereference in REDUCE_* cpu implementation" into rvc-dev
Diffstat (limited to 'nn/runtime')
-rw-r--r--nn/runtime/include/NeuralNetworks.h12
-rw-r--r--nn/runtime/test/generated/spec_V1_2/reduce_all_b155508675.example.cpp73
-rw-r--r--nn/runtime/test/generated/spec_V1_2/reduce_any_b155508675.example.cpp73
-rw-r--r--nn/runtime/test/generated/spec_V1_2/reduce_max_b155508675.example.cpp174
-rw-r--r--nn/runtime/test/generated/spec_V1_2/reduce_min_b155508675.example.cpp174
-rw-r--r--nn/runtime/test/generated/spec_V1_2/reduce_prod_b155508675.example.cpp174
-rw-r--r--nn/runtime/test/generated/spec_V1_2/reduce_sum_b155508675.example.cpp174
-rw-r--r--nn/runtime/test/specs/V1_2/reduce_all_b155508675.mod.py29
-rw-r--r--nn/runtime/test/specs/V1_2/reduce_any_b155508675.mod.py29
-rw-r--r--nn/runtime/test/specs/V1_2/reduce_max_b155508675.mod.py29
-rw-r--r--nn/runtime/test/specs/V1_2/reduce_min_b155508675.mod.py29
-rw-r--r--nn/runtime/test/specs/V1_2/reduce_prod_b155508675.mod.py29
-rw-r--r--nn/runtime/test/specs/V1_2/reduce_sum_b155508675.mod.py29
13 files changed, 1028 insertions, 0 deletions
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<bool8>({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<int32_t>({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<bool8>({false}),
+ .dimensions = {},
+ .isIgnored = false,
+ .lifetime = TestOperandLifeTime::CONSTANT_COPY,
+ .numberOfConsumers = 1,
+ .scale = 0.0f,
+ .type = TestOperandType::BOOL,
+ .zeroPoint = 0
+ }, { // op2
+ .channelQuant = {},
+ .data = TestBuffer::createFromVector<bool8>({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<bool8>({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<int32_t>({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<bool8>({false}),
+ .dimensions = {},
+ .isIgnored = false,
+ .lifetime = TestOperandLifeTime::CONSTANT_COPY,
+ .numberOfConsumers = 1,
+ .scale = 0.0f,
+ .type = TestOperandType::BOOL,
+ .zeroPoint = 0
+ }, { // op2
+ .channelQuant = {},
+ .data = TestBuffer::createFromVector<bool8>({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<float>({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<int32_t>({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<bool8>({false}),
+ .dimensions = {},
+ .isIgnored = false,
+ .lifetime = TestOperandLifeTime::CONSTANT_COPY,
+ .numberOfConsumers = 1,
+ .scale = 0.0f,
+ .type = TestOperandType::BOOL,
+ .zeroPoint = 0
+ }, { // op2
+ .channelQuant = {},
+ .data = TestBuffer::createFromVector<float>({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<float>({}),
+ .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<int32_t>({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<bool8>({false}),
+ .dimensions = {},
+ .isIgnored = false,
+ .lifetime = TestOperandLifeTime::CONSTANT_COPY,
+ .numberOfConsumers = 1,
+ .scale = 0.0f,
+ .type = TestOperandType::BOOL,
+ .zeroPoint = 0
+ }, { // op2
+ .channelQuant = {},
+ .data = TestBuffer::createFromVector<float>({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<float>({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<float>({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<int32_t>({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<float>({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<int32_t>({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<bool8>({false}),
+ .dimensions = {},
+ .isIgnored = false,
+ .lifetime = TestOperandLifeTime::CONSTANT_COPY,
+ .numberOfConsumers = 1,
+ .scale = 0.0f,
+ .type = TestOperandType::BOOL,
+ .zeroPoint = 0
+ }, { // op2
+ .channelQuant = {},
+ .data = TestBuffer::createFromVector<float>({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<float>({}),
+ .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<int32_t>({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<bool8>({false}),
+ .dimensions = {},
+ .isIgnored = false,
+ .lifetime = TestOperandLifeTime::CONSTANT_COPY,
+ .numberOfConsumers = 1,
+ .scale = 0.0f,
+ .type = TestOperandType::BOOL,
+ .zeroPoint = 0
+ }, { // op2
+ .channelQuant = {},
+ .data = TestBuffer::createFromVector<float>({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<float>({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<float>({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<int32_t>({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<float>({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<int32_t>({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<bool8>({false}),
+ .dimensions = {},
+ .isIgnored = false,
+ .lifetime = TestOperandLifeTime::CONSTANT_COPY,
+ .numberOfConsumers = 1,
+ .scale = 0.0f,
+ .type = TestOperandType::BOOL,
+ .zeroPoint = 0
+ }, { // op2
+ .channelQuant = {},
+ .data = TestBuffer::createFromVector<float>({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<float>({}),
+ .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<int32_t>({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<bool8>({false}),
+ .dimensions = {},
+ .isIgnored = false,
+ .lifetime = TestOperandLifeTime::CONSTANT_COPY,
+ .numberOfConsumers = 1,
+ .scale = 0.0f,
+ .type = TestOperandType::BOOL,
+ .zeroPoint = 0
+ }, { // op2
+ .channelQuant = {},
+ .data = TestBuffer::createFromVector<float>({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<float>({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<float>({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<int32_t>({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<float>({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<int32_t>({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<bool8>({false}),
+ .dimensions = {},
+ .isIgnored = false,
+ .lifetime = TestOperandLifeTime::CONSTANT_COPY,
+ .numberOfConsumers = 1,
+ .scale = 0.0f,
+ .type = TestOperandType::BOOL,
+ .zeroPoint = 0
+ }, { // op2
+ .channelQuant = {},
+ .data = TestBuffer::createFromVector<float>({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<float>({}),
+ .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<int32_t>({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<bool8>({false}),
+ .dimensions = {},
+ .isIgnored = false,
+ .lifetime = TestOperandLifeTime::CONSTANT_COPY,
+ .numberOfConsumers = 1,
+ .scale = 0.0f,
+ .type = TestOperandType::BOOL,
+ .zeroPoint = 0
+ }, { // op2
+ .channelQuant = {},
+ .data = TestBuffer::createFromVector<float>({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<float>({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<float>({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<int32_t>({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)