summaryrefslogtreecommitdiff
path: root/nn/runtime/test/specs/V1_3
diff options
context:
space:
mode:
authorSlava Shklyaev <slavash@google.com>2020-01-30 17:19:19 +0000
committerSlava Shklyaev <slavash@google.com>2020-02-17 17:57:51 +0000
commite46c85a8be206d14bb6e8338255e66a283dffdde (patch)
treee3b52b5f1b97c603df11443bc5f89fb19333b57d /nn/runtime/test/specs/V1_3
parent19f84c7eb7dfbe60507f84b6275bab0bd70e25ba (diff)
downloadml-e46c85a8be206d14bb6e8338255e66a283dffdde.tar.gz
Port control flow tests to test generator
Original tests: Ib371aeca Also adds some new tests. Bug: 148601177 Bug: 136735929 Test: generate_all_tests.sh Test: NNT_static Change-Id: Icf402cbd4172163ff3e9a4644804b2ef3dcf0743
Diffstat (limited to 'nn/runtime/test/specs/V1_3')
-rw-r--r--nn/runtime/test/specs/V1_3/if_simple.mod.py46
-rw-r--r--nn/runtime/test/specs/V1_3/while_fib.mod.py69
-rw-r--r--nn/runtime/test/specs/V1_3/while_sum_of_powers.mod.py104
3 files changed, 219 insertions, 0 deletions
diff --git a/nn/runtime/test/specs/V1_3/if_simple.mod.py b/nn/runtime/test/specs/V1_3/if_simple.mod.py
new file mode 100644
index 000000000..384bc2cf7
--- /dev/null
+++ b/nn/runtime/test/specs/V1_3/if_simple.mod.py
@@ -0,0 +1,46 @@
+#
+# 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: z = if (x) then (y + 100) else (y - 100)
+
+input_data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+output_add = [y + 100 for y in input_data]
+output_sub = [y - 100 for y in input_data]
+
+ValueType = ["TENSOR_FLOAT32", "{3, 4}"]
+BoolType = ["TENSOR_BOOL8", "{1}"]
+
+def MakeBranchModel(operation_name):
+ y = Input("y", ValueType)
+ z = Output("z", ValueType)
+ return Model().Operation(operation_name, y, [100.0], 0).To(z)
+
+x = Input("x", BoolType)
+y = Input("y", ValueType)
+z = Output("z", ValueType)
+then_model = MakeBranchModel("ADD")
+else_model = MakeBranchModel("SUB")
+model = Model().Operation("IF", x, then_model, else_model, y).To(z)
+
+Example({x: [True], y: input_data, z: output_add}, name="true", model=model)
+Example({x: [False], y: input_data, z: output_sub}, name="false", model=model)
+
+# Test with multiple references to the same referenced model.
+model = Model(name="same_branch_model")
+model.Operation("IF", x, then_model, then_model, y).To(z)
+
+Example({x: [True], y: input_data, z: output_add}, name="true", model=model)
+Example({x: [False], y: input_data, z: output_add}, name="false", model=model)
diff --git a/nn/runtime/test/specs/V1_3/while_fib.mod.py b/nn/runtime/test/specs/V1_3/while_fib.mod.py
new file mode 100644
index 000000000..ab2a5bc0c
--- /dev/null
+++ b/nn/runtime/test/specs/V1_3/while_fib.mod.py
@@ -0,0 +1,69 @@
+#
+# 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: given n, produces [fib(n), fib(n + 1)].
+#
+# fib = [1, 1]
+# i = 1
+# while i < n:
+# fib = matmul(fib, [0 1;
+# 1 1])
+# i = i + 1
+
+FibType = ["TENSOR_FLOAT32", "{1, 2}"]
+CounterType = ["TENSOR_INT32", "{1}"]
+BoolType = ["TENSOR_BOOL8", "{1}"]
+
+def MakeConditionModel():
+ fib = Input("fib", FibType)
+ i = Input("i", CounterType)
+ n = Input("n", CounterType)
+ out = Output("out", BoolType)
+ model = Model()
+ model.IdentifyInputs(fib, i, n)
+ model.IdentifyOutputs(out)
+ model.Operation("LESS", i, n).To(out)
+ return model
+
+def MakeBodyModel():
+ fib = Input("fib", FibType)
+ i = Input("i", CounterType)
+ n = Input("n", CounterType)
+ fib_out = Output("fib_out", FibType)
+ i_out = Output("i_out", CounterType)
+ matrix = Parameter("matrix", ["TENSOR_FLOAT32", "{2, 2}"], [0, 1, 1, 1])
+ zero_bias = Parameter("zero_bias", ["TENSOR_FLOAT32", "{2, 1}"], [0, 0])
+ model = Model()
+ model.IdentifyInputs(fib, i, n)
+ model.IdentifyOutputs(fib_out, i_out)
+ model.Operation("ADD", i, [1], 0).To(i_out)
+ model.Operation("FULLY_CONNECTED", fib, matrix, zero_bias, 0).To(fib_out)
+ return model
+
+n = Input("n", CounterType)
+fib_out = Output("fib_out", FibType)
+cond = MakeConditionModel()
+body = MakeBodyModel()
+fib_init = Parameter("fib_init", FibType, [1, 1])
+i_init = [1]
+model = Model().Operation("WHILE", cond, body, fib_init, i_init, n).To(fib_out)
+
+# Fibonacci numbers: 1 1 2 3 5 8
+Example({n: [1], fib_out: [1, 1]}, name="1", model=model)
+Example({n: [2], fib_out: [1, 2]}, name="2", model=model)
+Example({n: [3], fib_out: [2, 3]}, name="3", model=model)
+Example({n: [4], fib_out: [3, 5]}, name="4", model=model)
+Example({n: [5], fib_out: [5, 8]}, name="5", model=model)
diff --git a/nn/runtime/test/specs/V1_3/while_sum_of_powers.mod.py b/nn/runtime/test/specs/V1_3/while_sum_of_powers.mod.py
new file mode 100644
index 000000000..1cb35b4a4
--- /dev/null
+++ b/nn/runtime/test/specs/V1_3/while_sum_of_powers.mod.py
@@ -0,0 +1,104 @@
+#
+# 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: given x = [x0, x1] and n, produces [sum(x0 ^ i), sum(x1 ^ i)] for i in [1, n].
+#
+# sum = [1, 1] // More generarlly, sum = ones_like(x).
+# i = 1
+# while i <= n:
+# xi = x // x to the power of i (element-wise)
+# j = 1
+# while j < i:
+# xi = xi * x
+# j += 1
+# sum = sum + xi
+# i = i + 1
+
+DataType = ["TENSOR_FLOAT32", "{1, 2}"]
+CounterType = ["TENSOR_INT32", "{1}"]
+BoolType = ["TENSOR_BOOL8", "{1}"]
+
+def MakeInnerConditionModel():
+ xi = Input("xi", DataType)
+ j = Input("j", CounterType)
+ i = Input("i", CounterType)
+ x = Input("x", DataType)
+ out = Output("out", BoolType)
+ model = Model()
+ model.IdentifyInputs(xi, j, i, x)
+ model.IdentifyOutputs(out)
+ model.Operation("LESS", j, i).To(out)
+ return model
+
+def MakeInnerBodyModel():
+ xi = Input("xi", DataType)
+ j = Input("j", CounterType)
+ i = Input("i", CounterType)
+ x = Input("x", DataType)
+ xi_out = Output("xi_out", DataType)
+ j_out = Output("j_out", CounterType)
+ model = Model()
+ model.IdentifyInputs(xi, j, i, x)
+ model.IdentifyOutputs(xi_out, j_out)
+ model.Operation("MUL", xi, x, 0).To(xi_out)
+ model.Operation("ADD", j, [1], 0).To(j_out)
+ return model
+
+def MakeOuterConditionModel():
+ sum = Input("sum", DataType)
+ i = Input("i", CounterType)
+ n = Input("n", CounterType)
+ x = Input("x", DataType)
+ out = Output("out", BoolType)
+ model = Model()
+ model.IdentifyInputs(sum, i, n, x)
+ model.IdentifyOutputs(out)
+ model.Operation("LESS_EQUAL", i, n).To(out)
+ return model
+
+def MakeOuterBodyModel():
+ sum = Input("sum", DataType)
+ i = Input("i", CounterType)
+ n = Input("n", CounterType)
+ x = Input("x", DataType)
+ sum_out = Output("sum_out", DataType)
+ i_out = Output("i_out", CounterType)
+ xi_init = x
+ j_init = [1]
+ cond = MakeInnerConditionModel()
+ body = MakeInnerBodyModel()
+ xi = Internal("xi", DataType)
+ model = Model()
+ model.IdentifyInputs(sum, i, n, x)
+ model.IdentifyOutputs(sum_out, i_out)
+ model.Operation("WHILE", cond, body, xi_init, j_init, i, x).To(xi)
+ model.Operation("ADD", i, [1], 0).To(i_out)
+ model.Operation("ADD", sum, xi, 0).To(sum_out)
+ return model
+
+x = Input("x", DataType)
+n = Input("n", CounterType)
+sum = Output("sum", DataType)
+cond = MakeOuterConditionModel()
+body = MakeOuterBodyModel()
+sum_init = Parameter("sum_init", DataType, [1, 1])
+i_init = [1]
+model = Model().Operation("WHILE", cond, body, sum_init, i_init, n, x).To(sum)
+
+Example({x: [2, 3], n: [1], sum: [1 + 2, 1 + 3]}, name="1", model=model)
+Example({x: [2, 3], n: [2], sum: [1 + 2 + 4, 1 + 3 + 9]}, name="2", model=model)
+Example({x: [2, 3], n: [3], sum: [1 + 2 + 4 + 8, 1 + 3 + 9 + 27]}, name="3", model=model)
+Example({x: [2, 3], n: [4], sum: [1 + 2 + 4 + 8 + 16, 1 + 3 + 9 + 27 + 81]}, name="4", model=model)