1 // Copyright (C) 2020 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include "layer_test_utils.hpp"
7 namespace LayerTestsUtils {
9 LayerTestsCommon::LayerTestsCommon() {
10 core = PluginCache::get().ie(targetDevice).get();
13 void LayerTestsCommon::Run() {
14 SKIP_IF_CURRENT_TEST_IS_DISABLED()
22 LayerTestsCommon::~LayerTestsCommon() {
23 if (!configuration.empty()) {
24 PluginCache::get().reset();
28 InferenceEngine::Blob::Ptr LayerTestsCommon::GenerateInput(const InferenceEngine::InputInfo &info) const {
29 return FuncTestUtils::createAndFillBlob(info.getTensorDesc());
32 void LayerTestsCommon::Compare(const std::vector<std::uint8_t> &expected, const InferenceEngine::Blob::Ptr &actual) {
33 ASSERT_EQ(expected.size(), actual->byteSize());
34 const auto &expectedBuffer = expected.data();
36 auto memory = InferenceEngine::as<InferenceEngine::MemoryBlob>(actual);
38 const auto lockedMemory = memory->wmap();
39 const auto actualBuffer = lockedMemory.as<const std::uint8_t *>();
41 const auto &precision = actual->getTensorDesc().getPrecision();
42 const auto &size = actual->size();
44 case InferenceEngine::Precision::FP32:
45 Compare(reinterpret_cast<const float *>(expectedBuffer), reinterpret_cast<const float *>(actualBuffer),
48 case InferenceEngine::Precision::I32:
49 Compare(reinterpret_cast<const std::int32_t *>(expectedBuffer),
50 reinterpret_cast<const std::int32_t *>(actualBuffer), size, 0);
53 FAIL() << "Comparator for " << precision << " precision isn't supported";
57 void LayerTestsCommon::ConfigurePlugin() const {
58 if (!configuration.empty()) {
59 core->SetConfig(configuration, targetDevice);
63 void LayerTestsCommon::ConfigureNetwork() const {
64 for (const auto &in : cnnNetwork.getInputsInfo()) {
65 if (inLayout != InferenceEngine::Layout::ANY) {
66 in.second->setLayout(inLayout);
68 if (inPrc != InferenceEngine::Precision::UNSPECIFIED) {
69 in.second->setPrecision(inPrc);
73 for (const auto &out : cnnNetwork.getOutputsInfo()) {
74 if (outLayout != InferenceEngine::Layout::ANY) {
75 out.second->setLayout(outLayout);
77 if (outPrc != InferenceEngine::Precision::UNSPECIFIED) {
78 out.second->setPrecision(outPrc);
83 void LayerTestsCommon::LoadNetwork() {
84 cnnNetwork = InferenceEngine::CNNNetwork{function};
86 executableNetwork = core->LoadNetwork(cnnNetwork, targetDevice);
89 void LayerTestsCommon::Infer() {
90 inferRequest = executableNetwork.CreateInferRequest();
92 for (const auto &input : cnnNetwork.getInputsInfo()) {
93 const auto &info = input.second;
95 auto blob = GenerateInput(*info);
96 inferRequest.SetBlob(info->name(), blob);
97 inputs.push_back(blob);
102 std::vector<InferenceEngine::Blob::Ptr> LayerTestsCommon::GetOutputs() {
103 auto outputs = std::vector<InferenceEngine::Blob::Ptr>{};
104 for (const auto &output : cnnNetwork.getOutputsInfo()) {
105 const auto &name = output.first;
106 outputs.push_back(inferRequest.GetBlob(name));
111 void LayerTestsCommon::Compare(const std::vector<std::vector<std::uint8_t>>& expectedOutputs, const std::vector<InferenceEngine::Blob::Ptr>& actualOutputs) {
112 for (std::size_t outputIndex = 0; outputIndex < expectedOutputs.size(); ++outputIndex) {
113 const auto &expected = expectedOutputs[outputIndex];
114 const auto &actual = actualOutputs[outputIndex];
115 Compare(expected, actual);
119 void LayerTestsCommon::Validate() {
120 // nGraph interpreter does not support f16
121 // IE converts f16 to f32
122 ngraph::pass::ConvertPrecision<ngraph::element::Type_t::f16, ngraph::element::Type_t::f32>().run_on_function(function);
123 function->validate_nodes_and_infer_types();
124 auto referenceInputs = std::vector<std::vector<std::uint8_t>>(inputs.size());
125 for (std::size_t i = 0; i < inputs.size(); ++i) {
126 const auto &input = inputs[i];
127 const auto &inputSize = input->byteSize();
129 auto &referenceInput = referenceInputs[i];
130 referenceInput.resize(inputSize);
132 auto memory = InferenceEngine::as<InferenceEngine::MemoryBlob>(input);
134 const auto lockedMemory = memory->wmap();
135 const auto buffer = lockedMemory.as<const std::uint8_t *>();
136 std::copy(buffer, buffer + inputSize, referenceInput.data());
138 std::vector<std::vector<std::uint8_t>> expectedOutputs;
141 expectedOutputs = ngraph::helpers::interpreterFunction(function, referenceInputs);
143 case CONSTANT_FOLDING:
144 const auto &foldedFunc = ngraph::helpers::foldFunction(function, referenceInputs);
145 expectedOutputs = ngraph::helpers::getConstData(foldedFunc);
149 const auto &actualOutputs = GetOutputs();
150 IE_ASSERT(actualOutputs.size() == expectedOutputs.size())
151 << "nGraph interpreter has " << expectedOutputs.size() << " outputs, while IE " << actualOutputs.size();
153 Compare(expectedOutputs, actualOutputs);
156 void LayerTestsCommon::SetRefMode(RefMode mode) {
159 } // namespace LayerTestsUtils