1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
7 #include <gtest/gtest.h>
8 #include <mock_icnn_network.hpp>
9 #include "inference_engine/layer_transform.hpp"
12 using namespace InferenceEngine;
13 using namespace ::testing;
15 class LayerTransformTest : public ::testing::Test {
17 struct TransformMocker {
18 MOCK_CONST_METHOD0(mockTransform, bool());
20 bool operator () (T ) const {
21 return mockTransform();
24 TransformMocker tmock;
25 void SetUp() override {
29 TEST_F(LayerTransformTest, canInjectIntoConvolutionLayer) {
31 ConvolutionLayer lc(LayerParams{"name", "type", Precision::FP32});
34 lc._kernel.insert(X_AXIS, 23);
35 lc._kernel.insert(Y_AXIS, 24);
37 auto layerWithData = injectData<int>(lc);
38 dynamic_cast<details::LayerInjector<ConvolutionLayer, int>*>(layerWithData.get())->injected = 5;
40 ASSERT_EQ(dynamic_cast<ConvolutionLayer*>(layerWithData.get())->_kernel[X_AXIS], 23);
41 ASSERT_EQ(dynamic_cast<ConvolutionLayer*>(layerWithData.get())->_kernel[Y_AXIS], 24);
44 TEST_F(LayerTransformTest, canInjectValue) {
46 ConvolutionLayer lc(LayerParams{"name", "type", Precision::FP32});
49 lc._kernel.insert(X_AXIS, 23);
50 lc._kernel.insert(Y_AXIS, 24);
52 auto layerWithData = injectData<int>(lc, 6);
53 ASSERT_EQ((dynamic_cast<details::LayerInjector<ConvolutionLayer, int>*>(layerWithData.get())->injected), 6);
55 ASSERT_EQ(dynamic_cast<ConvolutionLayer*>(layerWithData.get())->_kernel[X_AXIS], 23);
56 ASSERT_EQ(dynamic_cast<ConvolutionLayer*>(layerWithData.get())->_kernel[Y_AXIS], 24);
59 TEST_F(LayerTransformTest, canAccessInjectedValue) {
61 ConvolutionLayer lc(LayerParams{"name", "type", Precision::FP32});
64 lc._kernel.insert(X_AXIS, 23);
65 lc._kernel.insert(Y_AXIS, 24);
67 auto layerWithData = injectData<int>(lc, 7);
68 auto injectedData = getInjectedData<int>(layerWithData);
70 ASSERT_NE(injectedData, nullptr);
71 ASSERT_EQ(*injectedData, 7);
73 ASSERT_EQ(dynamic_cast<ConvolutionLayer*>(layerWithData.get())->_kernel[X_AXIS], 23);
74 ASSERT_EQ(dynamic_cast<ConvolutionLayer*>(layerWithData.get())->_kernel[Y_AXIS], 24);
77 TEST_F(LayerTransformTest, returnNullIfNotInjected) {
79 ConvolutionLayer lc(LayerParams{"name", "type", Precision::FP32});
82 lc._kernel.insert(X_AXIS, 23);
83 lc._kernel.insert(Y_AXIS, 24);
85 auto layerWithData = injectData<int>(lc, 7);
87 ASSERT_EQ(getInjectedData<float>(layerWithData), nullptr);
89 ASSERT_EQ(dynamic_cast<ConvolutionLayer*>(layerWithData.get())->_kernel[X_AXIS], 23);
90 ASSERT_EQ(dynamic_cast<ConvolutionLayer*>(layerWithData.get())->_kernel[Y_AXIS], 24);
99 TEST_F(LayerTransformTest, canInjectStruct) {
101 FullyConnectedLayer fc(LayerParams{"name", "type", Precision::FP32});
104 auto layerWithData = injectData<SomeData>(fc, SomeData({11, "myname", 12.f}));
106 auto some = getInjectedData<SomeData>(layerWithData);
108 ASSERT_NE(some, nullptr);
109 ASSERT_STREQ(some->name.c_str(), "myname");
110 ASSERT_EQ(some->ivalue, 11);
111 ASSERT_FLOAT_EQ(some->value, 12.f);
112 ASSERT_EQ(dynamic_cast<FullyConnectedLayer*>(layerWithData.get())->_out_num, 9);
115 // out data array items is fully copied, not just references to them
116 TEST_F(LayerTransformTest, injectioWillCopyOutData) {
118 auto fc = std::make_shared<FullyConnectedLayer>(LayerParams{"name", "type", Precision::FP32});
119 ASSERT_NE(fc, nullptr);
122 auto data = std::make_shared<Data>("N1", Precision::FP32);
123 data->getCreatorLayer() = fc;
124 fc->outData.push_back(data);
126 auto layerWithData = injectData<SomeData>(fc, SomeData({11, "myname", 12.f}));
128 ASSERT_EQ(data->getCreatorLayer().lock(), layerWithData->outData[0]->getCreatorLayer().lock());
129 ASSERT_NE(data.get(), layerWithData->outData[0].get());
132 TEST_F(LayerTransformTest, injectioWillCopyInputData) {
134 auto fc = std::make_shared<FullyConnectedLayer>(LayerParams{"name", "type", Precision::FP32});
135 ASSERT_NE(fc, nullptr);
138 auto data = std::make_shared<Data>("N1", Precision::FP32);
139 data->getCreatorLayer() = fc;
140 fc->insData.push_back(data);
142 auto layerWithData = injectData<SomeData>(fc, SomeData({11, "myname", 12.f}));
144 ASSERT_EQ(data.get(), layerWithData->insData[0].lock().get());
147 TEST_F(LayerTransformTest, transformWillOnlyTransformOnce) {
149 auto fc = std::make_shared<FullyConnectedLayer>(LayerParams{"name", "type", Precision::FP32});
150 ASSERT_NE(fc, nullptr);
153 EXPECT_CALL(tmock, mockTransform()).WillOnce(Return(true));
155 // CNNLayer might be selected in case of overloads
156 transformLayer(fc, tmock);
159 TEST_F(LayerTransformTest, transformCanGoToParentIfChildTransformNotImplemented) {
161 auto fc = std::make_shared<FullyConnectedLayer>(LayerParams{"name", "type", Precision::FP32});
162 ASSERT_NE(fc, nullptr);
166 EXPECT_CALL(tmock, mockTransform()).InSequence(s1).WillOnce(Return(false));
167 EXPECT_CALL(tmock, mockTransform()).InSequence(s1).WillOnce(Return(false));
168 EXPECT_CALL(tmock, mockTransform()).InSequence(s1).WillOnce(Return(true));
170 // CNNLayer might be selected in case of overloads
171 transformLayer(fc, tmock);