3 * Copyright (C) 2018-2019 Intel Corporation.
5 * The source code contained or described herein and all documents
6 * related to the source code ("Material") are owned by Intel Corporation
7 * or its suppliers or licensors. Title to the Material remains with
8 * Intel Corporation or its suppliers and licensors. The Material may
9 * contain trade secrets and proprietary and confidential information
10 * of Intel Corporation and its suppliers and licensors, and is protected
11 * by worldwide copyright and trade secret laws and treaty provisions.
12 * No part of the Material may be used, copied, reproduced, modified,
13 * published, uploaded, posted, transmitted, distributed, or disclosed
14 * in any way without Intel's prior express written permission.
16 * No license under any patent, copyright, trade secret or other
17 * intellectual property right is granted to or conferred upon you by
18 * disclosure or delivery of the Materials, either expressly, by implication,
19 * inducement, estoppel or otherwise. Any license under such intellectual
20 * property rights must be express and approved by Intel in writing.
22 * Include any supplier copyright notices as supplier requires Intel to use.
24 * Include supplier trademarks or logos as supplier requires Intel to use,
25 * preceded by an asterisk. An asterisked footnote can be added as follows:
26 * *Third Party trademarks are the property of their respective owners.
28 * Unless otherwise agreed by Intel in writing, you may not remove or alter
29 * this notice or any other notice embedded in Materials by Intel or Intel's
30 * suppliers or licensors in any way.
40 #include <xml_net_builder.hpp>
44 using namespace testing;
47 std::map<std::string, int> mapOfEqualShapes {
48 // Layer name, Correct num of input, Correct num of output
50 { "Deconvolution", 1},
55 std::map<std::string, std::pair<int, int>> mapOfUnequalShapes {
56 // Layer name, Correct num of input, Correct num of output
58 { "DetectionOutput", {3, 1}},
62 std::map<std::string, std::pair<std::string, std::string>> mapOfContinuousShapes {
63 // Layer name, Correct num of input, Correct num of output
64 { "Slice", {"1", "N"}},
65 { "Eltwise", {"N", "1"}}
73 ShapesHelper() = default;
75 explicit ShapesHelper(std::string& type) {
79 std::string getType() {return type;}
81 virtual testing::InOutShapes getValidShapes() = 0;
82 virtual testing::InOutShapes getInvalidInputShapes() = 0;
84 std::vector<std::vector<size_t>> generateShapes(const int& numOfShapes) {
85 std::mt19937 gen(static_cast<unsigned long>(std::chrono::high_resolution_clock::now().time_since_epoch().count()));
86 std::uniform_int_distribution<unsigned long> dist(1, 256);
88 std::vector<std::vector<size_t>> shape;
89 shape.reserve(static_cast<unsigned long>(numOfShapes));
90 for (int i = 0; i < numOfShapes; ++i) {
91 shape.push_back({dist(gen), dist(gen), dist(gen), 7});
95 virtual ~ShapesHelper() = default;
98 class EqualIOShapesHelper : public ShapesHelper {
100 explicit EqualIOShapesHelper(std::string& type) : ShapesHelper(type) {};
102 testing::InOutShapes getValidShapes() override {
103 int numOfInput = {maps.mapOfEqualShapes[type]};
104 int numOfOutput = {maps.mapOfEqualShapes[type]};
105 std::vector<std::vector<size_t>> inputs = generateShapes(numOfInput);
106 std::vector<std::vector<size_t>> outputs = generateShapes(numOfOutput);
107 return {inputs, outputs};
110 testing::InOutShapes getInvalidInputShapes() override {
111 int numOfOutput = maps.mapOfEqualShapes[type];
112 int numOfInput = maps.mapOfEqualShapes[type] + numOfOutput;
113 std::vector<std::vector<size_t>> inputs = generateShapes(numOfInput);
114 std::vector<std::vector<size_t>> outputs = generateShapes(numOfOutput);
115 return {inputs, outputs};
117 ~EqualIOShapesHelper() override = default;
120 class NotEqualConcreteIOShapesHelper : public ShapesHelper {
122 explicit NotEqualConcreteIOShapesHelper(std::string& type) : ShapesHelper(type) {};
124 testing::InOutShapes getValidShapes() override {
125 int numOfInput = maps.mapOfUnequalShapes[type].first;
126 int numOfOutput = maps.mapOfUnequalShapes[type].second;
127 std::vector<std::vector<size_t>> inputs = generateShapes(numOfInput);
128 std::vector<std::vector<size_t>> outputs = generateShapes(numOfOutput);
129 return {inputs, outputs};
132 testing::InOutShapes getInvalidInputShapes() override {
133 int numOfOutput = maps.mapOfUnequalShapes[type].second;
134 int numOfInput = maps. mapOfUnequalShapes[type].first + numOfOutput;
136 std::vector<std::vector<size_t>> inputs = generateShapes(numOfInput);
137 std::vector<std::vector<size_t>> outputs = generateShapes(numOfOutput);
138 return {inputs, outputs};
140 ~NotEqualConcreteIOShapesHelper() override = default;
143 class NotEqualIOShapesHelper : public ShapesHelper {
145 bool is_number(const std::string& s)
147 return !s.empty() && std::find_if(s.begin(),
148 s.end(), [](char c) { return !std::isdigit(c); }) == s.end();
153 explicit NotEqualIOShapesHelper(std::string& type) : ShapesHelper(type) {};
155 testing::InOutShapes getValidShapes() override {
158 std::vector<std::vector<size_t>> inputs;
159 std::vector<std::vector<size_t>> outputs;
160 if (is_number(maps.mapOfContinuousShapes[type].first)) {
161 numOfInput = std::stoi(maps.mapOfContinuousShapes[type].first);
162 inputs = generateShapes(numOfInput);
163 outputs = generateShapes(100);
165 numOfOutput = std::stoi(maps.mapOfContinuousShapes[type].second);
166 outputs = generateShapes(numOfOutput);
167 inputs = generateShapes(100);
170 return {inputs, outputs};
173 testing::InOutShapes getInvalidInputShapes() override {
176 std::vector<std::vector<size_t>> inputs;
177 std::vector<std::vector<size_t>> outputs;
178 if (is_number(maps.mapOfContinuousShapes[type].first)) {
179 numOfInput = std::stoi(maps.mapOfContinuousShapes[type].first) * 2;
180 inputs = generateShapes(numOfInput);
181 outputs = generateShapes(100);
183 numOfOutput = std::stoi(maps.mapOfContinuousShapes[type].second);
184 outputs = generateShapes(numOfOutput);
185 inputs = generateShapes(100);
187 return {inputs, outputs};
190 ~NotEqualIOShapesHelper() override = default;
195 virtual bool containLayer(std::string concrete_layer) = 0;
196 virtual ShapesHelper* factoryShape() = 0;
197 virtual ~Layers() = default;
200 class LayersWithEqualIO : public Layers {
202 std::string layer = "";
204 bool containLayer(std::string concrete_layer) override {
205 for (const auto& layer : maps.mapOfEqualShapes) {
206 if (concrete_layer == layer.first) {
207 this->layer = concrete_layer;
213 ShapesHelper* factoryShape() override {
214 return new EqualIOShapesHelper(this->layer);
216 ~LayersWithEqualIO() override = default;
219 class LayersWithNotEqualIO : public Layers{
221 std::string layer = "";
223 bool containLayer(std::string concrete_layer) override {
224 for (const auto& layer : maps.mapOfUnequalShapes) {
225 if (concrete_layer == layer.first) {
226 this->layer = concrete_layer;
232 ShapesHelper* factoryShape() override {
233 return new NotEqualConcreteIOShapesHelper(this->layer);
235 ~LayersWithNotEqualIO() override = default;
238 class LayersWithNIO : public Layers{
240 std::string layer = "";
242 bool containLayer(std::string concrete_layer) override {
243 for (const auto& layer : maps.mapOfContinuousShapes) {
244 if (concrete_layer == layer.first) {
245 this->layer = concrete_layer;
251 ShapesHelper* factoryShape() override {
252 return new NotEqualIOShapesHelper(this->layer);
254 ~LayersWithNIO() override = default;