Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / thirdparty / clDNN / src / include / error_handler.h
1 /*
2 // Copyright (c) 2017-2018 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16
17 ///////////////////////////////////////////////////////////////////////////////////////////////////
18 #pragma once
19 #include <sstream>
20 #include <vector>
21 #include <array>
22 #include <algorithm>
23 #include <type_traits>
24 #include "api/CPP/layout.hpp"
25
26 namespace cldnn
27 {
28
29 namespace err_details
30 {
31     void cldnn_print_error_message(const std::string& file, int line, const std::string& instance_id, std::stringstream &msg, const std::string& add_msg = "");
32 }
33
34 template<typename N1, typename N2>
35 inline void error_on_not_equal(const std::string& file, int line, const std::string& instance_id, const std::string& number_id, N1 number, const std::string& compare_to_id, N2 number_to_compare_to, const std::string& additional_message = "")
36 {
37     if (number != static_cast<decltype(number)>(number_to_compare_to))
38     {
39         std::stringstream error_msg;
40         error_msg << number_id << "(=" << number << ") is not equal to: " << compare_to_id << "(=" << number_to_compare_to << ")" << std::endl;
41         err_details::cldnn_print_error_message(file, line, instance_id, error_msg, additional_message);
42     }
43 }
44 #define CLDNN_ERROR_NOT_EQUAL(instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg) error_on_not_equal(__FILE__, __LINE__, instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg)
45
46 template<typename N1, typename N2>
47 inline void error_on_equal(const std::string& file, int line, const std::string& instance_id, const std::string& number_id, N1 number, const std::string& compare_to_id, N2 number_to_compare_to, const std::string& additional_message = "")
48 {
49     if (number == static_cast<decltype(number)>(number_to_compare_to))
50     {
51         std::stringstream error_msg;
52         error_msg << number_id << "(=" << number << ") is equal to: " << compare_to_id << "(=" << number_to_compare_to << ")" << std::endl;
53         err_details::cldnn_print_error_message(file, line, instance_id, error_msg, additional_message);
54     }
55 }
56 #define CLDNN_ERROR_EQUAL(instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg) error_on_equal(__FILE__, __LINE__, instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg)
57
58 template<typename N1, typename N2>
59 inline void error_on_greater_than(const std::string& file, int line, const std::string& instance_id, const std::string& number_id, N1 number, const std::string& compare_to_id, N2 number_to_compare_to, const std::string& additional_message = "")
60 {
61     if (number > static_cast<decltype(number)>(number_to_compare_to))
62     {
63         std::stringstream error_msg;
64         error_msg << number_id << "(=" << number << ") is greater than: " << compare_to_id << "(=" << number_to_compare_to << ")" << std::endl;
65         err_details::cldnn_print_error_message(file, line, instance_id, error_msg, additional_message);
66     }
67 }
68 #define CLDNN_ERROR_GREATER_THAN(instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg) error_on_greater_than(__FILE__, __LINE__, instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg)
69
70 template<typename N1, typename N2>
71 inline void error_on_less_than(const std::string& file, int line, const std::string& instance_id, const std::string& number_id, N1 number, const std::string& compare_to_id, N2 number_to_compare_to, const std::string& additional_message = "")
72 {
73     if (number < static_cast<decltype(number)>(number_to_compare_to))
74     {
75         std::stringstream error_msg;
76         error_msg << number_id << "(=" << number << ") is less than: " << compare_to_id << "(=" << number_to_compare_to << ")" << std::endl;
77         err_details::cldnn_print_error_message(file, line, instance_id, error_msg, additional_message);
78     }
79 }
80 #define CLDNN_ERROR_LESS_THAN(instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg) error_on_less_than(__FILE__, __LINE__, instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg)
81
82 template<typename N1, typename N2>
83 inline void error_on_less_or_equal_than(const std::string& file, int line, const std::string& instance_id, const std::string& number_id, N1 number, const std::string& compare_to_id, N2 number_to_compare_to, const std::string& additional_message = "")
84 {
85     if (number <= static_cast<decltype(number)>(number_to_compare_to))
86     {
87         std::stringstream error_msg;
88         error_msg << number_id << "(=" << number << ") is less or equal than: " << compare_to_id << "(=" << number_to_compare_to << ")" << std::endl;
89         err_details::cldnn_print_error_message(file, line, instance_id, error_msg, additional_message);
90     }
91 }
92 #define CLDNN_ERROR_LESS_OR_EQUAL_THAN(instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg) error_on_less_or_equal_than(__FILE__, __LINE__, instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg)
93
94 template<typename N1, typename N2>
95 inline void error_on_greater_or_equal_than(const std::string& file, int line, const std::string& instance_id, const std::string& number_id, N1 number, const std::string& compare_to_id, N2 number_to_compare_to, const std::string& additional_message = "")
96 {
97     if (number >= static_cast<decltype(number)>(number_to_compare_to))
98     {
99         std::stringstream error_msg;
100         error_msg << number_id << "(=" << number << ") is greater or equal than: " << compare_to_id << "(=" << number_to_compare_to << ")" << std::endl;
101         err_details::cldnn_print_error_message(file, line, instance_id, error_msg, additional_message);
102     }
103 }
104 #define CLDNN_ERROR_GREATER_OR_EQUAL_THAN(instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg) error_on_greater_or_equal_than(__FILE__, __LINE__, instance_id, number_id, number, compare_to_id, number_to_compare_to, add_msg)
105
106 template<typename ptr>
107 inline void error_on_nullptr(const std::string& file, int line, const std::string& instance_id, const std::string& condition_id, ptr condition, const std::string& additional_message = "")
108 {
109     if (condition == nullptr)
110     {
111         std::stringstream error_msg;
112         error_msg << condition_id << " should not be null" << std::endl;
113         err_details::cldnn_print_error_message(file, line, instance_id, error_msg, additional_message);
114     }
115 }
116 #define CLDNN_ERROR_NULLPTR(instance_id, condition_id, condition, add_msg) error_on_nullptr(__FILE__, __LINE__, instance_id, condition_id, condition, add_msg)
117
118 template<typename M = format, typename... Ms>
119 inline void error_on_not_proper_enum_values(const std::string& file, int line, const std::string& instance_id, const std::string& mode_id, M mode, const std::string& modes_id, Ms... modes_to_compare_to)
120 {
121     auto enum_value_string = [](const M& mode)->std::string {
122         if (std::is_same<M, format::type>::value)
123         {
124             return format::traits(mode).order;
125         }
126         return "error during error parsing";
127     };
128     const std::array<const M, sizeof...(Ms)> modes{ std::forward<Ms>(modes_to_compare_to)... };
129     if (std::all_of(modes.begin(), modes.end(), [&](const M& m)->int {return mode != m; }))
130     {
131         std::stringstream error_msg;
132         error_msg << mode_id << "( " << enum_value_string(mode) << " ) is incompatible with " << modes_id << ". Should be one of: ";
133         for (const auto& ms : modes)
134         {
135             error_msg << enum_value_string(ms) << ", ";
136         }
137         error_msg << std::endl;
138         err_details::cldnn_print_error_message(file, line, instance_id, error_msg);
139     }
140 }
141 #define CLDNN_ERROR_NOT_PROPER_FORMAT(instance_id, format_id, formatt, formats_ids, ...) error_on_not_proper_enum_values(__FILE__, __LINE__, instance_id, format_id, formatt, formats_ids, __VA_ARGS__)
142
143 void error_message(const std::string& file, int line, const std::string& instance_id, const std::string& message);
144 #define CLDNN_ERROR_MESSAGE(instance_id, message) error_message(__FILE__, __LINE__, instance_id, message)
145
146 void error_on_not_supported_fp16(const std::string& file, int line, const std::string& instance_id, uint8_t supp_fp16, bool fp16_used);
147 #define CLDNN_ERROR_NOT_SUPPORTED_FP16(instance_id, gpu_supp_fp16, fp16_used) error_on_not_supported_fp16(__FILE__, __LINE__, instance_id, gpu_supp_fp16, fp16_used)
148
149 void error_on_mismatch_layout(const std::string& file, int line, const std::string& instance_id, const std::string& layout_1_id, const layout& layout_1, const std::string& layout_2_id, const layout& layout_2, const std::string& additional_message = "");
150 #define CLDNN_ERROR_LAYOUT_MISMATCH(instance_id, layout_1_id, layout_1, layout_2_id, layout_2, add_msg) error_on_mismatch_layout(__FILE__, __LINE__, instance_id, layout_1_id, layout_1, layout_2_id, layout_2, add_msg)
151
152 void error_on_bool(const std::string& file, int line, const std::string& instance_id, const std::string& condition_id, bool condition, const std::string& additional_message = "");
153 #define CLDNN_ERROR_BOOL(instance_id, condition_id, condition, add_msg) error_on_bool(__FILE__, __LINE__, instance_id, condition_id, condition, add_msg)
154
155 void error_on_mismatching_data_types(const std::string& file, int line, const std::string& instance_id, const std::string& data_format_1_id, data_types data_format_1, const std::string& data_format_2_id, data_types data_format_2, const std::string& additional_message = "", bool ignore_sign = false);
156 #define CLDNN_ERROR_DATA_TYPES_MISMATCH(instance_id, data_format_1_id, data_format_1, data_format_2_id, data_format_2, add_msg) error_on_mismatching_data_types(__FILE__, __LINE__, instance_id, data_format_1_id, data_format_1, data_format_2_id, data_format_2, add_msg)
157 #define CLDNN_ERROR_DATA_TYPES_MISMATCH_IGNORE_SIGN(instance_id, data_format_1_id, data_format_1, data_format_2_id, data_format_2, add_msg) error_on_mismatching_data_types(__FILE__, __LINE__, instance_id, data_format_1_id, data_format_1, data_format_2_id, data_format_2, add_msg, true)
158
159 void error_on_tensor_dims_less_than_other_tensor_dims(const std::string& file, int line, const std::string& instance_id, const std::string& tensor_id, const tensor& tens, const std::string& tensor_to_compare_to_id, const tensor& tens_to_compre, const std::string& additional_message = "");
160 #define CLDNN_ERROR_TENSOR_SIZES_LESS_THAN(instance_id, tensor_id, tensor_1, compare_to_id, tensor_to_compare_to, ...) error_on_tensor_dims_less_than_other_tensor_dims(__FILE__, __LINE__, instance_id, tensor_id, tensor_1, compare_to_id, tensor_to_compare_to, __VA_ARGS__)
161
162 void error_on_tensor_dims_greater_than_other_tensor_dims(const std::string& file, int line, const std::string& instance_id, const std::string& tensor_id, const tensor& tens, const std::string& tensor_to_compare_to_id, const tensor& tens_to_compre, const std::string& additional_message = "");
163 #define CLDNN_ERROR_TENSOR_SIZES_GREATER_THAN(instance_id, tensor_id, tensor_1, compare_to_id, tensor_to_compare_to, ...) error_on_tensor_dims_greater_than_other_tensor_dims(__FILE__, __LINE__, instance_id, tensor_id, tensor_1, compare_to_id, tensor_to_compare_to, __VA_ARGS__)
164
165 void error_on_tensor_dims_not_dividable_by_other_tensor_dims(const std::string& file, int line, const std::string& instance_id, const std::string& tensor_id, const tensor& tens, const std::string& tensor_to_compare_to_id, const tensor& tens_to_compre, const std::string& additional_message = "");
166 #define CLDNN_ERROR_TENSOR_SIZES_NOT_DIVIDABLE(instance_id, tensor_id, tensor_1, compare_to_id, tensor_to_compare_to, ...) error_on_tensor_dims_not_dividable_by_other_tensor_dims(__FILE__, __LINE__, instance_id, tensor_id, tensor_1, compare_to_id, tensor_to_compare_to, __VA_ARGS__)
167
168
169 }