TestGenerated.cpp revision 6a0d306cf902e13ab147c7533b2cb02540ee66d5
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
17ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung// Top level driver for models and examples generated by test_generator.py
18242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
19242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "NeuralNetworksWrapper.h"
206a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung#include "TestHarness.h"
21242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
22242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include <gtest/gtest.h>
23242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include <cassert>
24242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include <cmath>
25ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung#include <functional>
26242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include <iostream>
27242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include <map>
28242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
296a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sungnamespace generated_tests {
30ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sungusing namespace android::nn::wrapper;
316a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
32ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sungtemplate <typename T>
33ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sungclass Example {
34ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung   public:
35ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung    typedef T ElementType;
36ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung    typedef std::pair<std::map<int, std::vector<T>>,
37ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                      std::map<int, std::vector<T>>>
38ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung        ExampleType;
39ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung
40ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung    static bool Execute(std::function<void(Model*)> create_model,
41ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                        std::vector<ExampleType>& examples,
42ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                        std::function<bool(const T, const T)> compare) {
43ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung        Model model;
44ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung        create_model(&model);
45ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung
46ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung        int example_no = 1;
47ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung        bool error = false;
48ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung        for (auto& example : examples) {
49ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            Request request(&model);
50ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung
51ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            // Go through all inputs
52ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            for (auto& i : example.first) {
53ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                std::vector<T>& input = i.second;
54ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                request.setInput(i.first, (const void*)input.data(),
55ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                                 input.size() * sizeof(T));
56ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            }
57ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung
58ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            std::map<int, std::vector<T>> test_outputs;
59ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung
60ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            assert(example.second.size() == 1);
61ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            int output_no = 0;
62ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            for (auto& i : example.second) {
63ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                std::vector<T>& output = i.second;
64ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                test_outputs[i.first].resize(output.size());
65ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                std::vector<T>& test_output = test_outputs[i.first];
66ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                request.setOutput(output_no++, (void*)test_output.data(),
67ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                                  test_output.size() * sizeof(T));
68ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            }
69ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            Result r = request.compute();
70ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            if (r != Result::NO_ERROR)
71ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                std::cerr << "Request was not completed normally\n";
72ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            bool mismatch = false;
73ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            for (auto& i : example.second) {
74ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                const std::vector<T>& test = test_outputs[i.first];
75ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                const std::vector<T>& golden = i.second;
76ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                for (unsigned i = 0; i < golden.size(); i++) {
77ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                    if (compare(golden[i], test[i])) {
78ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                        std::cerr << " output[" << i << "] = " << (float)test[i]
79ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                                  << " (should be " << (float)golden[i]
80ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                                  << ")\n";
81ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                        error = error || true;
82ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                        mismatch = mismatch || true;
83ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                    }
84ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                }
85ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            }
86ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            if (mismatch) {
87ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                std::cerr << "Example: " << example_no++;
88ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung                std::cerr << " failed\n";
89ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            }
90ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung        }
91ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung        return error;
92ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung    }
936a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
946a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    // Test driver for those generated from ml/nn/runtime/test/spec
956a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    static void Execute(std::function<void(Model*)> create_model,
966a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung                        std::vector<MixedTypedExampleType>& examples) {
976a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        Model model;
986a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        create_model(&model);
996a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
1006a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        int example_no = 1;
1016a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        for (auto& example : examples) {
1026a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            SCOPED_TRACE(example_no++);
1036a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
1046a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            MixedTyped& inputs = example.first;
1056a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            MixedTyped& golden = example.second;
1066a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
1076a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            Request request(&model);
1086a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
1096a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            // Go through all ty-typed inputs
1106a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung#define SET_TYPED_TENSOR_INPUT(ty)                                     \
1116a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    for (auto& i : std::get<std::map<int, std::vector<ty>>>(inputs)) { \
1126a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        request.setInput(i.first, (const void*)i.second.data(),        \
1136a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung                         i.second.size() * sizeof(ty));                \
1146a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    }
1156a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
1166a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            SET_TYPED_TENSOR_INPUT(float);
1176a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            SET_TYPED_TENSOR_INPUT(int32_t);
1186a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            SET_TYPED_TENSOR_INPUT(uint8_t);
1196a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung#undef SET_TYPED_TENSOR_INPUT
1206a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
1216a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            MixedTyped test;
1226a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            // Go through all typed outputs
1236a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung#define SET_TYPED_OUTPUT(ty)                                              \
1246a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    auto& golden_##ty = std::get<std::map<int, std::vector<ty>>>(golden); \
1256a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    auto& test_##ty = std::get<std::map<int, std::vector<ty>>>(test);     \
1266a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    for (auto& i : golden_##ty) {                                         \
1276a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        int idx = i.first;                                                \
1286a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        auto& golden_output = i.second;                                   \
1296a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        test_##ty[idx].resize(golden_output.size());                      \
1306a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        request.setOutput(idx, (void*)test_##ty[idx].data(),              \
1316a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung                          test_##ty[idx].size() * sizeof(ty));            \
1326a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    }
1336a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            SET_TYPED_OUTPUT(float);
1346a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            SET_TYPED_OUTPUT(int32_t);
1356a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            SET_TYPED_OUTPUT(uint8_t);
1366a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung#undef SET_TYPED_OUTPUT
1376a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
1386a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            Result r = request.compute();
1396a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            ASSERT_EQ(Result::NO_ERROR, r);
1406a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
1416a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            EXPECT_EQ(golden_float, test_float);
1426a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            EXPECT_EQ(golden_int32_t, test_int32_t);
1436a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung            EXPECT_EQ(golden_uint8_t, test_uint8_t);
1446a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        }
1456a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    }
146ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung};
1476a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung};  // namespace generated_tests
148ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung
1496a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sungusing namespace android::nn::wrapper;
150ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung// Float32 examples
1516a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sungtypedef generated_tests::Example<float>::ExampleType Example;
1526a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung// Mixed-typed examples
1536a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sungtypedef generated_tests::MixedTypedExampleType MixedTypedExample;
154242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
1556a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sungvoid Execute(std::function<void(Model*)> create_model,
1566a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung             std::vector<MixedTypedExample>& examples) {
1576a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    generated_tests::Example<float>::Execute(create_model, examples);
1586a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung}
159242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
1606a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sungclass GeneratedTests : public ::testing::Test {
1616a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung   protected:
1626a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    virtual void SetUp() {
1636a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung        ASSERT_EQ(android::nn::wrapper::Initialize(),
1646a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung                  android::nn::wrapper::Result::NO_ERROR);
1656a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    }
1666a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
1676a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    virtual void TearDown() { android::nn::wrapper::Shutdown(); }
168dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung};
169dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung
1706a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung// Testcases generated from runtime/test/specs/*.mod.py
1716a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung#include "generated/all_generated_tests.cpp"
1726a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung// End of testcases generated from runtime/test/specs/*.mod.py
1736a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung
1746a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung// Below are testcases geneated from TFLite testcases.
175242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace conv_1_h3_w2_SAME {
176242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
177242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
178242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/conv_1_h3_w2_SAME_tests.example.cc"
179242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
180242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
181242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/conv_1_h3_w2_SAME.model.cpp"
182242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace conv_1_h3_w2_SAME
183242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
184242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace conv_1_h3_w2_VALID {
185242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
186242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
187242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/conv_1_h3_w2_VALID_tests.example.cc"
188242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
189242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
190242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/conv_1_h3_w2_VALID.model.cpp"
191242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace conv_1_h3_w2_VALID
192242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
193242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace conv_3_h3_w2_SAME {
194242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
195242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
196242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/conv_3_h3_w2_SAME_tests.example.cc"
197242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
198242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
199242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/conv_3_h3_w2_SAME.model.cpp"
200242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace conv_3_h3_w2_SAME
201242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
202242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace conv_3_h3_w2_VALID {
203242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
204242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
205242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/conv_3_h3_w2_VALID_tests.example.cc"
206242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
207242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
208242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/conv_3_h3_w2_VALID.model.cpp"
209242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace conv_3_h3_w2_VALID
210242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
211242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace depthwise_conv {
212242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
213242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
214242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/depthwise_conv_tests.example.cc"
215242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
216242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
217242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/depthwise_conv.model.cpp"
218242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace depthwise_conv
219242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
220242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace mobilenet {
221242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungstd::vector<Example> examples = {
222242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Converted examples
223242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/examples/mobilenet_224_gender_basic_fixed_tests.example.cc"
224242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung};
225242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung// Generated model constructor
226242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung#include "generated/models/mobilenet_224_gender_basic_fixed.model.cpp"
227242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace mobilenet
228242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
229242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sungnamespace {
230ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sungbool Execute(std::function<void(Model*)> create_model,
231ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung             std::vector<Example>& examples) {
2326a0d306cf902e13ab147c7533b2cb02540ee66d5I-Jui (Ray) Sung    return generated_tests::Example<float>::Execute(
233ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung        create_model, examples, [](float golden, float test) {
234ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung            return std::fabs(golden - test) > 1.5e-5f;
235ad36b7a0dd7468bbe6a0433a52cbf89561ff5538I-Jui (Ray) Sung        });
236242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
237242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}  // namespace
238242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
239dcd2fbf1da7ebdc1aa1b57c74db4fffd2911e3b8I-Jui (Ray) Sung
240242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, conv_1_h3_w2_SAME) {
241242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(
242242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        Execute(conv_1_h3_w2_SAME::CreateModel, conv_1_h3_w2_SAME::examples),
243242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        0);
244242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
245242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
246242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, conv_1_h3_w2_VALID) {
247242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(
248242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        Execute(conv_1_h3_w2_VALID::CreateModel, conv_1_h3_w2_VALID::examples),
249242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        0);
250242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
251242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
252242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, conv_3_h3_w2_SAME) {
253242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(
254242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        Execute(conv_3_h3_w2_SAME::CreateModel, conv_3_h3_w2_SAME::examples),
255242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        0);
256242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
257242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
258242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, conv_3_h3_w2_VALID) {
259242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(
260242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        Execute(conv_3_h3_w2_VALID::CreateModel, conv_3_h3_w2_VALID::examples),
261242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung        0);
262242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
263242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
264242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, depthwise_conv) {
265242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(Execute(depthwise_conv::CreateModel, depthwise_conv::examples),
266242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung              0);
267242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
268242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung
269242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) SungTEST_F(GeneratedTests, mobilenet) {
270242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung    ASSERT_EQ(Execute(mobilenet::CreateModel, mobilenet::examples), 0);
271242c6dc1f314646f1a87c66140f26d7623cc399aI-Jui (Ray) Sung}
272