TestGenerated.cpp revision dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8
1242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung/*
2242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung * Copyright (C) 2017 The Android Open Source Project
3242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung *
4242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung * Licensed under the Apache License, Version 2.0 (the "License");
5242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung * you may not use this file except in compliance with the License.
6242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung * You may obtain a copy of the License at
7242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung *
8242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung *      http://www.apache.org/licenses/LICENSE-2.0
9242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung *
10242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung * Unless required by applicable law or agreed to in writing, software
11242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung * distributed under the License is distributed on an "AS IS" BASIS,
12242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung * See the License for the specific language governing permissions and
14242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung * limitations under the License.
15242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung */
16242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
17242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Top level driver for models and examples converted from TFLite tests
18242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
19242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "NeuralNetworksWrapper.h"
20242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
21242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include <gtest/gtest.h>
22242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include <cassert>
23242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include <cmath>
24242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include <iostream>
25242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include <map>
26242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
27242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungtypedef std::pair<std::map<int, std::vector<float>>,
28242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung                  std::map<int, std::vector<float>>>
29242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    Example;
30242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
31242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungusing namespace android::nn::wrapper;
32242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
33dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sungnamespace add {
34dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sungstd::vector<Example> examples = {
35dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung// Generated add
36dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung#include "generated/examples/add_tests.example.cc"
37dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung};
38dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung// Generated model constructor
39dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung#include "generated/models/add.model.cpp"
40dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung}  // add
41dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung
42242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace conv_1_h3_w2_SAME {
43242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
44242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
45242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/conv_1_h3_w2_SAME_tests.example.cc"
46242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
47242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
48242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/conv_1_h3_w2_SAME.model.cpp"
49242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace conv_1_h3_w2_SAME
50242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
51242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace conv_1_h3_w2_VALID {
52242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
53242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
54242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/conv_1_h3_w2_VALID_tests.example.cc"
55242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
56242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
57242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/conv_1_h3_w2_VALID.model.cpp"
58242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace conv_1_h3_w2_VALID
59242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
60242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace conv_3_h3_w2_SAME {
61242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
62242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
63242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/conv_3_h3_w2_SAME_tests.example.cc"
64242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
65242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
66242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/conv_3_h3_w2_SAME.model.cpp"
67242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace conv_3_h3_w2_SAME
68242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
69242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace conv_3_h3_w2_VALID {
70242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
71242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
72242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/conv_3_h3_w2_VALID_tests.example.cc"
73242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
74242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
75242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/conv_3_h3_w2_VALID.model.cpp"
76242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace conv_3_h3_w2_VALID
77242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
78242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace depthwise_conv {
79242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
80242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
81242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/depthwise_conv_tests.example.cc"
82242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
83242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
84242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/depthwise_conv.model.cpp"
85242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace depthwise_conv
86242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
87242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace mobilenet {
88242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
89242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
90242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/mobilenet_224_gender_basic_fixed_tests.example.cc"
91242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
92242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
93242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/mobilenet_224_gender_basic_fixed.model.cpp"
94242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace mobilenet
95242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
96242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace {
97242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungbool Execute(void (*create_model)(Model*), std::vector<Example>& examples) {
98242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    Model model;
99242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    create_model(&model);
100242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
101242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    int example_no = 1;
102242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    bool error = false;
103242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
104242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    for (auto& example : examples) {
105242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        Request request(&model);
106242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
107242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        // Go through all inputs
108242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        for (auto& i : example.first) {
109242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            std::vector<float>& input = i.second;
110242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            request.setInput(i.first, (const void*)input.data(),
111242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung                             input.size() * sizeof(float));
112242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        }
113242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
114242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        std::map<int, std::vector<float>> test_outputs;
115242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
116242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        assert(example.second.size() == 1);
117242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        int output_no = 0;
118242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        for (auto& i : example.second) {
119242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            std::vector<float>& output = i.second;
120242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            test_outputs[i.first].resize(output.size());
121242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            std::vector<float>& test_output = test_outputs[i.first];
122242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            request.setOutput(output_no++, (void*)test_output.data(),
123242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung                              test_output.size() * sizeof(float));
124242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        }
125242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        Result r = request.compute();
126242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        if (r != Result::NO_ERROR)
127242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            std::cerr << "Request was not completed normally\n";
128242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        bool mismatch = false;
129242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        for (auto& i : example.second) {
130242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            std::vector<float>& test = test_outputs[i.first];
131242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            std::vector<float>& golden = i.second;
132242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            for (unsigned i = 0; i < golden.size(); i++) {
133242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung                if (std::fabs(golden[i] - test[i]) > 1.5e-5f) {
134242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung                    std::cerr << " output[" << i << "] = " << test[i]
135242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung                              << " (should be " << golden[i] << ")\n";
136242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung                    error = error || true;
137242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung                    mismatch = mismatch || true;
138242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung                }
139242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            }
140242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        }
141242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        if (mismatch) {
142242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            std::cerr << "Example: " << example_no++;
143242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung            std::cerr << " failed\n";
144242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        }
145242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    }
146242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    return error;
147242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
148242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
149242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungclass GeneratedTests : public ::testing::Test {
150242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung   protected:
151242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    virtual void SetUp() {
152242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        ASSERT_EQ(android::nn::wrapper::Initialize(),
153242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung                  android::nn::wrapper::Result::NO_ERROR);
154242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    }
155242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
156242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    virtual void TearDown() { android::nn::wrapper::Shutdown(); }
157242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
158242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace
159242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
160dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) SungTEST_F(GeneratedTests, add) {
161dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung    ASSERT_EQ(
162dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung        Execute(add::CreateModel, add::examples),
163dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung        0);
164dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung}
165dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung
166242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, conv_1_h3_w2_SAME) {
167242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(
168242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        Execute(conv_1_h3_w2_SAME::CreateModel, conv_1_h3_w2_SAME::examples),
169242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        0);
170242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
171242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
172242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, conv_1_h3_w2_VALID) {
173242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(
174242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        Execute(conv_1_h3_w2_VALID::CreateModel, conv_1_h3_w2_VALID::examples),
175242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        0);
176242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
177242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
178242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, conv_3_h3_w2_SAME) {
179242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(
180242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        Execute(conv_3_h3_w2_SAME::CreateModel, conv_3_h3_w2_SAME::examples),
181242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        0);
182242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
183242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
184242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, conv_3_h3_w2_VALID) {
185242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(
186242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        Execute(conv_3_h3_w2_VALID::CreateModel, conv_3_h3_w2_VALID::examples),
187242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        0);
188242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
189242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
190242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, depthwise_conv) {
191242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(Execute(depthwise_conv::CreateModel, depthwise_conv::examples),
192242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung              0);
193242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
194242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
195242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, mobilenet) {
196242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(Execute(mobilenet::CreateModel, mobilenet::examples), 0);
197242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
198