1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
12 #include <xml_net_builder.hpp>
16 using namespace testing;
19 std::map<std::string, int> mapOfEqualShapes {
20 // Layer name, Correct num of input, Correct num of output
22 { "Deconvolution", 1},
27 std::map<std::string, std::pair<int, int>> mapOfUnequalShapes {
28 // Layer name, Correct num of input, Correct num of output
30 { "DetectionOutput", {3, 1}},
34 std::map<std::string, std::pair<std::string, std::string>> mapOfContinuousShapes {
35 // Layer name, Correct num of input, Correct num of output
36 { "Slice", {"1", "N"}},
37 { "Eltwise", {"N", "1"}}
45 ShapesHelper() = default;
47 explicit ShapesHelper(std::string& type) {
51 std::string getType() {return type;}
53 virtual testing::InOutShapes getValidShapes() = 0;
54 virtual testing::InOutShapes getInvalidInputShapes() = 0;
56 std::vector<std::vector<size_t>> generateShapes(const int& numOfShapes) {
57 std::mt19937 gen(static_cast<unsigned long>(std::chrono::high_resolution_clock::now().time_since_epoch().count()));
58 std::uniform_int_distribution<unsigned long> dist(1, 256);
60 std::vector<std::vector<size_t>> shape;
61 shape.reserve(static_cast<unsigned long>(numOfShapes));
62 for (int i = 0; i < numOfShapes; ++i) {
63 shape.push_back({dist(gen), dist(gen), dist(gen), 7});
67 virtual ~ShapesHelper() = default;
70 class EqualIOShapesHelper : public ShapesHelper {
72 explicit EqualIOShapesHelper(std::string& type) : ShapesHelper(type) {};
74 testing::InOutShapes getValidShapes() override {
75 int numOfInput = {maps.mapOfEqualShapes[type]};
76 int numOfOutput = {maps.mapOfEqualShapes[type]};
77 std::vector<std::vector<size_t>> inputs = generateShapes(numOfInput);
78 std::vector<std::vector<size_t>> outputs = generateShapes(numOfOutput);
79 return {inputs, outputs};
82 testing::InOutShapes getInvalidInputShapes() override {
83 int numOfOutput = maps.mapOfEqualShapes[type];
84 int numOfInput = maps.mapOfEqualShapes[type] + numOfOutput;
85 std::vector<std::vector<size_t>> inputs = generateShapes(numOfInput);
86 std::vector<std::vector<size_t>> outputs = generateShapes(numOfOutput);
87 return {inputs, outputs};
89 ~EqualIOShapesHelper() override = default;
92 class NotEqualConcreteIOShapesHelper : public ShapesHelper {
94 explicit NotEqualConcreteIOShapesHelper(std::string& type) : ShapesHelper(type) {};
96 testing::InOutShapes getValidShapes() override {
97 int numOfInput = maps.mapOfUnequalShapes[type].first;
98 int numOfOutput = maps.mapOfUnequalShapes[type].second;
99 std::vector<std::vector<size_t>> inputs = generateShapes(numOfInput);
100 std::vector<std::vector<size_t>> outputs = generateShapes(numOfOutput);
101 return {inputs, outputs};
104 testing::InOutShapes getInvalidInputShapes() override {
105 int numOfOutput = maps.mapOfUnequalShapes[type].second;
106 int numOfInput = maps. mapOfUnequalShapes[type].first + numOfOutput;
108 std::vector<std::vector<size_t>> inputs = generateShapes(numOfInput);
109 std::vector<std::vector<size_t>> outputs = generateShapes(numOfOutput);
110 return {inputs, outputs};
112 ~NotEqualConcreteIOShapesHelper() override = default;
115 class NotEqualIOShapesHelper : public ShapesHelper {
117 bool is_number(const std::string& s)
119 return !s.empty() && std::find_if(s.begin(),
120 s.end(), [](char c) { return !std::isdigit(c); }) == s.end();
125 explicit NotEqualIOShapesHelper(std::string& type) : ShapesHelper(type) {};
127 testing::InOutShapes getValidShapes() override {
130 std::vector<std::vector<size_t>> inputs;
131 std::vector<std::vector<size_t>> outputs;
132 if (is_number(maps.mapOfContinuousShapes[type].first)) {
133 numOfInput = std::stoi(maps.mapOfContinuousShapes[type].first);
134 inputs = generateShapes(numOfInput);
135 outputs = generateShapes(100);
137 numOfOutput = std::stoi(maps.mapOfContinuousShapes[type].second);
138 outputs = generateShapes(numOfOutput);
139 inputs = generateShapes(100);
142 return {inputs, outputs};
145 testing::InOutShapes getInvalidInputShapes() override {
148 std::vector<std::vector<size_t>> inputs;
149 std::vector<std::vector<size_t>> outputs;
150 if (is_number(maps.mapOfContinuousShapes[type].first)) {
151 numOfInput = std::stoi(maps.mapOfContinuousShapes[type].first) * 2;
152 inputs = generateShapes(numOfInput);
153 outputs = generateShapes(100);
155 numOfOutput = std::stoi(maps.mapOfContinuousShapes[type].second);
156 outputs = generateShapes(numOfOutput);
157 inputs = generateShapes(100);
159 return {inputs, outputs};
162 ~NotEqualIOShapesHelper() override = default;
167 virtual bool containLayer(std::string concrete_layer) = 0;
168 virtual ShapesHelper* factoryShape() = 0;
169 virtual ~Layers() = default;
172 class LayersWithEqualIO : public Layers {
174 std::string layer = "";
176 bool containLayer(std::string concrete_layer) override {
177 for (const auto& layer : maps.mapOfEqualShapes) {
178 if (concrete_layer == layer.first) {
179 this->layer = concrete_layer;
185 ShapesHelper* factoryShape() override {
186 return new EqualIOShapesHelper(this->layer);
188 ~LayersWithEqualIO() override = default;
191 class LayersWithNotEqualIO : public Layers{
193 std::string layer = "";
195 bool containLayer(std::string concrete_layer) override {
196 for (const auto& layer : maps.mapOfUnequalShapes) {
197 if (concrete_layer == layer.first) {
198 this->layer = concrete_layer;
204 ShapesHelper* factoryShape() override {
205 return new NotEqualConcreteIOShapesHelper(this->layer);
207 ~LayersWithNotEqualIO() override = default;
210 class LayersWithNIO : public Layers{
212 std::string layer = "";
214 bool containLayer(std::string concrete_layer) override {
215 for (const auto& layer : maps.mapOfContinuousShapes) {
216 if (concrete_layer == layer.first) {
217 this->layer = concrete_layer;
223 ShapesHelper* factoryShape() override {
224 return new NotEqualIOShapesHelper(this->layer);
226 ~LayersWithNIO() override = default;