From e46c85a8be206d14bb6e8338255e66a283dffdde Mon Sep 17 00:00:00 2001 From: Slava Shklyaev Date: Thu, 30 Jan 2020 17:19:19 +0000 Subject: 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 --- nn/runtime/test/specs/V1_3/if_simple.mod.py | 46 +++++++++ nn/runtime/test/specs/V1_3/while_fib.mod.py | 69 ++++++++++++++ .../test/specs/V1_3/while_sum_of_powers.mod.py | 104 +++++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 nn/runtime/test/specs/V1_3/if_simple.mod.py create mode 100644 nn/runtime/test/specs/V1_3/while_fib.mod.py create mode 100644 nn/runtime/test/specs/V1_3/while_sum_of_powers.mod.py (limited to 'nn/runtime/test/specs/V1_3') 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) -- cgit v1.2.3