xref: /aosp_15_r20/external/pytorch/c10/util/Logging.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #ifndef C10_UTIL_LOGGING_H_
2*da0073e9SAndroid Build Coastguard Worker #define C10_UTIL_LOGGING_H_
3*da0073e9SAndroid Build Coastguard Worker 
4*da0073e9SAndroid Build Coastguard Worker #include <climits>
5*da0073e9SAndroid Build Coastguard Worker #include <exception>
6*da0073e9SAndroid Build Coastguard Worker #include <functional>
7*da0073e9SAndroid Build Coastguard Worker #include <limits>
8*da0073e9SAndroid Build Coastguard Worker #include <sstream>
9*da0073e9SAndroid Build Coastguard Worker 
10*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/Macros.h>
11*da0073e9SAndroid Build Coastguard Worker #include <c10/util/Backtrace.h>
12*da0073e9SAndroid Build Coastguard Worker #include <c10/util/Exception.h>
13*da0073e9SAndroid Build Coastguard Worker #include <c10/util/Flags.h>
14*da0073e9SAndroid Build Coastguard Worker #include <c10/util/StringUtil.h>
15*da0073e9SAndroid Build Coastguard Worker 
16*da0073e9SAndroid Build Coastguard Worker // CAFFE2_LOG_THRESHOLD is a compile time flag that would allow us to turn off
17*da0073e9SAndroid Build Coastguard Worker // logging at compile time so no logging message below that level is produced
18*da0073e9SAndroid Build Coastguard Worker // at all. The value should be between INT_MIN and CAFFE_FATAL.
19*da0073e9SAndroid Build Coastguard Worker #ifndef CAFFE2_LOG_THRESHOLD
20*da0073e9SAndroid Build Coastguard Worker // If we have not defined the compile time log threshold, we keep all the
21*da0073e9SAndroid Build Coastguard Worker // log cases.
22*da0073e9SAndroid Build Coastguard Worker #define CAFFE2_LOG_THRESHOLD INT_MIN
23*da0073e9SAndroid Build Coastguard Worker #endif // CAFFE2_LOG_THRESHOLD
24*da0073e9SAndroid Build Coastguard Worker 
25*da0073e9SAndroid Build Coastguard Worker // Below are different implementations for glog and non-glog cases.
26*da0073e9SAndroid Build Coastguard Worker #ifdef C10_USE_GLOG
27*da0073e9SAndroid Build Coastguard Worker #include <c10/util/logging_is_google_glog.h>
28*da0073e9SAndroid Build Coastguard Worker #else // !C10_USE_GLOG
29*da0073e9SAndroid Build Coastguard Worker #include <c10/util/logging_is_not_google_glog.h>
30*da0073e9SAndroid Build Coastguard Worker #endif // C10_USE_GLOG
31*da0073e9SAndroid Build Coastguard Worker 
32*da0073e9SAndroid Build Coastguard Worker C10_DECLARE_int(caffe2_log_level);
33*da0073e9SAndroid Build Coastguard Worker C10_DECLARE_bool(caffe2_use_fatal_for_enforce);
34*da0073e9SAndroid Build Coastguard Worker 
35*da0073e9SAndroid Build Coastguard Worker // Some versions of GLOG support less-spammy version of LOG_EVERY_MS. If it's
36*da0073e9SAndroid Build Coastguard Worker // not available - just short-circuit to the always working one one.
37*da0073e9SAndroid Build Coastguard Worker // We define the C10_ name to avoid confusing other files
38*da0073e9SAndroid Build Coastguard Worker #ifdef LOG_EVERY_MS
39*da0073e9SAndroid Build Coastguard Worker #define C10_LOG_EVERY_MS(severity, ms) LOG_EVERY_MS(severity, ms)
40*da0073e9SAndroid Build Coastguard Worker #else
41*da0073e9SAndroid Build Coastguard Worker #define C10_LOG_EVERY_MS(severity, ms) LOG(severity)
42*da0073e9SAndroid Build Coastguard Worker #endif
43*da0073e9SAndroid Build Coastguard Worker 
44*da0073e9SAndroid Build Coastguard Worker // Same for LOG_FIRST_N
45*da0073e9SAndroid Build Coastguard Worker #ifdef LOG_FIRST_N
46*da0073e9SAndroid Build Coastguard Worker #define C10_LOG_FIRST_N(severity, n) LOG_FIRST_N(severity, n)
47*da0073e9SAndroid Build Coastguard Worker #else
48*da0073e9SAndroid Build Coastguard Worker #define C10_LOG_FIRST_N(severity, n) LOG(severity)
49*da0073e9SAndroid Build Coastguard Worker #endif
50*da0073e9SAndroid Build Coastguard Worker 
51*da0073e9SAndroid Build Coastguard Worker // Same for LOG_EVERY_N
52*da0073e9SAndroid Build Coastguard Worker #ifdef LOG_EVERY_N
53*da0073e9SAndroid Build Coastguard Worker #define C10_LOG_EVERY_N(severity, n) LOG_EVERY_N(severity, n)
54*da0073e9SAndroid Build Coastguard Worker #else
55*da0073e9SAndroid Build Coastguard Worker #define C10_LOG_EVERY_N(severity, n) LOG(severity)
56*da0073e9SAndroid Build Coastguard Worker #endif
57*da0073e9SAndroid Build Coastguard Worker 
58*da0073e9SAndroid Build Coastguard Worker namespace c10 {
59*da0073e9SAndroid Build Coastguard Worker 
60*da0073e9SAndroid Build Coastguard Worker using std::string;
61*da0073e9SAndroid Build Coastguard Worker 
62*da0073e9SAndroid Build Coastguard Worker // Functions that we use for initialization.
63*da0073e9SAndroid Build Coastguard Worker C10_API bool InitCaffeLogging(int* argc, char** argv);
64*da0073e9SAndroid Build Coastguard Worker C10_API void UpdateLoggingLevelsFromFlags();
65*da0073e9SAndroid Build Coastguard Worker 
66*da0073e9SAndroid Build Coastguard Worker [[noreturn]] C10_API void ThrowEnforceNotMet(
67*da0073e9SAndroid Build Coastguard Worker     const char* file,
68*da0073e9SAndroid Build Coastguard Worker     const int line,
69*da0073e9SAndroid Build Coastguard Worker     const char* condition,
70*da0073e9SAndroid Build Coastguard Worker     const std::string& msg,
71*da0073e9SAndroid Build Coastguard Worker     const void* caller = nullptr);
72*da0073e9SAndroid Build Coastguard Worker 
73*da0073e9SAndroid Build Coastguard Worker [[noreturn]] C10_API void ThrowEnforceNotMet(
74*da0073e9SAndroid Build Coastguard Worker     const char* file,
75*da0073e9SAndroid Build Coastguard Worker     const int line,
76*da0073e9SAndroid Build Coastguard Worker     const char* condition,
77*da0073e9SAndroid Build Coastguard Worker     const char* msg,
78*da0073e9SAndroid Build Coastguard Worker     const void* caller = nullptr);
79*da0073e9SAndroid Build Coastguard Worker 
80*da0073e9SAndroid Build Coastguard Worker [[noreturn]] C10_API inline void ThrowEnforceNotMet(
81*da0073e9SAndroid Build Coastguard Worker     const char* file,
82*da0073e9SAndroid Build Coastguard Worker     const int line,
83*da0073e9SAndroid Build Coastguard Worker     const char* condition,
84*da0073e9SAndroid Build Coastguard Worker     detail::CompileTimeEmptyString /*msg*/,
85*da0073e9SAndroid Build Coastguard Worker     const void* caller = nullptr) {
86*da0073e9SAndroid Build Coastguard Worker   ThrowEnforceNotMet(file, line, condition, "", caller);
87*da0073e9SAndroid Build Coastguard Worker }
88*da0073e9SAndroid Build Coastguard Worker 
89*da0073e9SAndroid Build Coastguard Worker [[noreturn]] C10_API void ThrowEnforceFiniteNotMet(
90*da0073e9SAndroid Build Coastguard Worker     const char* file,
91*da0073e9SAndroid Build Coastguard Worker     const int line,
92*da0073e9SAndroid Build Coastguard Worker     const char* condition,
93*da0073e9SAndroid Build Coastguard Worker     const std::string& msg,
94*da0073e9SAndroid Build Coastguard Worker     const void* caller = nullptr);
95*da0073e9SAndroid Build Coastguard Worker 
96*da0073e9SAndroid Build Coastguard Worker [[noreturn]] C10_API void ThrowEnforceFiniteNotMet(
97*da0073e9SAndroid Build Coastguard Worker     const char* file,
98*da0073e9SAndroid Build Coastguard Worker     const int line,
99*da0073e9SAndroid Build Coastguard Worker     const char* condition,
100*da0073e9SAndroid Build Coastguard Worker     const char* msg,
101*da0073e9SAndroid Build Coastguard Worker     const void* caller = nullptr);
102*da0073e9SAndroid Build Coastguard Worker 
103*da0073e9SAndroid Build Coastguard Worker [[noreturn]] C10_API inline void ThrowEnforceFiniteNotMet(
104*da0073e9SAndroid Build Coastguard Worker     const char* file,
105*da0073e9SAndroid Build Coastguard Worker     const int line,
106*da0073e9SAndroid Build Coastguard Worker     const char* condition,
107*da0073e9SAndroid Build Coastguard Worker     detail::CompileTimeEmptyString /*msg*/,
108*da0073e9SAndroid Build Coastguard Worker     const void* caller = nullptr) {
109*da0073e9SAndroid Build Coastguard Worker   ThrowEnforceFiniteNotMet(file, line, condition, "", caller);
110*da0073e9SAndroid Build Coastguard Worker }
111*da0073e9SAndroid Build Coastguard Worker 
IsUsingGoogleLogging()112*da0073e9SAndroid Build Coastguard Worker constexpr bool IsUsingGoogleLogging() {
113*da0073e9SAndroid Build Coastguard Worker #ifdef C10_USE_GLOG
114*da0073e9SAndroid Build Coastguard Worker   return true;
115*da0073e9SAndroid Build Coastguard Worker #else
116*da0073e9SAndroid Build Coastguard Worker   return false;
117*da0073e9SAndroid Build Coastguard Worker #endif
118*da0073e9SAndroid Build Coastguard Worker }
119*da0073e9SAndroid Build Coastguard Worker 
120*da0073e9SAndroid Build Coastguard Worker /**
121*da0073e9SAndroid Build Coastguard Worker  * A utility to allow one to show log info to stderr after the program starts.
122*da0073e9SAndroid Build Coastguard Worker  *
123*da0073e9SAndroid Build Coastguard Worker  * This is similar to calling GLOG's --logtostderr, or setting caffe2_log_level
124*da0073e9SAndroid Build Coastguard Worker  * to smaller than INFO. You are recommended to only use this in a few sparse
125*da0073e9SAndroid Build Coastguard Worker  * cases, such as when you want to write a tutorial or something. Normally, use
126*da0073e9SAndroid Build Coastguard Worker  * the commandline flags to set the log level.
127*da0073e9SAndroid Build Coastguard Worker  */
128*da0073e9SAndroid Build Coastguard Worker C10_API void ShowLogInfoToStderr();
129*da0073e9SAndroid Build Coastguard Worker 
130*da0073e9SAndroid Build Coastguard Worker C10_API void SetStackTraceFetcher(std::function<::c10::Backtrace()> fetcher);
131*da0073e9SAndroid Build Coastguard Worker 
132*da0073e9SAndroid Build Coastguard Worker /**
133*da0073e9SAndroid Build Coastguard Worker  * Convenience function for non-lazy stack trace fetchers. The Backtrace
134*da0073e9SAndroid Build Coastguard Worker  * overload should be preferred when stringifying the backtrace is expensive.
135*da0073e9SAndroid Build Coastguard Worker  */
136*da0073e9SAndroid Build Coastguard Worker C10_API void SetStackTraceFetcher(std::function<std::string()> fetcher);
137*da0073e9SAndroid Build Coastguard Worker 
138*da0073e9SAndroid Build Coastguard Worker using EnforceNotMet = ::c10::Error;
139*da0073e9SAndroid Build Coastguard Worker 
140*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE(condition, ...)                               \
141*da0073e9SAndroid Build Coastguard Worker   do {                                                              \
142*da0073e9SAndroid Build Coastguard Worker     if (C10_UNLIKELY(!(condition))) {                               \
143*da0073e9SAndroid Build Coastguard Worker       ::c10::ThrowEnforceNotMet(                                    \
144*da0073e9SAndroid Build Coastguard Worker           __FILE__, __LINE__, #condition, ::c10::str(__VA_ARGS__)); \
145*da0073e9SAndroid Build Coastguard Worker     }                                                               \
146*da0073e9SAndroid Build Coastguard Worker   } while (false)
147*da0073e9SAndroid Build Coastguard Worker 
148*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_FINITE(condition, ...)                        \
149*da0073e9SAndroid Build Coastguard Worker   do {                                                              \
150*da0073e9SAndroid Build Coastguard Worker     if (C10_UNLIKELY(!(condition))) {                               \
151*da0073e9SAndroid Build Coastguard Worker       ::c10::ThrowEnforceFiniteNotMet(                              \
152*da0073e9SAndroid Build Coastguard Worker           __FILE__, __LINE__, #condition, ::c10::str(__VA_ARGS__)); \
153*da0073e9SAndroid Build Coastguard Worker     }                                                               \
154*da0073e9SAndroid Build Coastguard Worker   } while (false)
155*da0073e9SAndroid Build Coastguard Worker 
156*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_WITH_CALLER(condition, ...)                         \
157*da0073e9SAndroid Build Coastguard Worker   do {                                                                    \
158*da0073e9SAndroid Build Coastguard Worker     if (C10_UNLIKELY(!(condition))) {                                     \
159*da0073e9SAndroid Build Coastguard Worker       ::c10::ThrowEnforceNotMet(                                          \
160*da0073e9SAndroid Build Coastguard Worker           __FILE__, __LINE__, #condition, ::c10::str(__VA_ARGS__), this); \
161*da0073e9SAndroid Build Coastguard Worker     }                                                                     \
162*da0073e9SAndroid Build Coastguard Worker   } while (false)
163*da0073e9SAndroid Build Coastguard Worker 
164*da0073e9SAndroid Build Coastguard Worker #define CAFFE_THROW(...) \
165*da0073e9SAndroid Build Coastguard Worker   ::c10::ThrowEnforceNotMet(__FILE__, __LINE__, "", ::c10::str(__VA_ARGS__))
166*da0073e9SAndroid Build Coastguard Worker 
167*da0073e9SAndroid Build Coastguard Worker /**
168*da0073e9SAndroid Build Coastguard Worker  * Rich logging messages
169*da0073e9SAndroid Build Coastguard Worker  *
170*da0073e9SAndroid Build Coastguard Worker  * CAFFE_ENFORCE_THAT can be used with one of the "checker functions" that
171*da0073e9SAndroid Build Coastguard Worker  * capture input argument values and add it to the exception message. E.g.
172*da0073e9SAndroid Build Coastguard Worker  * `CAFFE_ENFORCE_THAT(Equals(foo(x), bar(y)), "Optional additional message")`
173*da0073e9SAndroid Build Coastguard Worker  * would evaluate both foo and bar only once and if the results are not equal -
174*da0073e9SAndroid Build Coastguard Worker  * include them in the exception message.
175*da0073e9SAndroid Build Coastguard Worker  *
176*da0073e9SAndroid Build Coastguard Worker  * Some of the basic checker functions like Equals or Greater are already
177*da0073e9SAndroid Build Coastguard Worker  * defined below. Other header might define customized checkers by adding
178*da0073e9SAndroid Build Coastguard Worker  * functions to caffe2::enforce_detail namespace. For example:
179*da0073e9SAndroid Build Coastguard Worker  *
180*da0073e9SAndroid Build Coastguard Worker  *   namespace caffe2 { namespace enforce_detail {
181*da0073e9SAndroid Build Coastguard Worker  *   inline EnforceFailMessage IsVector(const vector<int64_t>& shape) {
182*da0073e9SAndroid Build Coastguard Worker  *     if (shape.size() == 1) { return EnforceOK(); }
183*da0073e9SAndroid Build Coastguard Worker  *     return c10::str("Shape ", shape, " is not a vector");
184*da0073e9SAndroid Build Coastguard Worker  *   }
185*da0073e9SAndroid Build Coastguard Worker  *   }}
186*da0073e9SAndroid Build Coastguard Worker  *
187*da0073e9SAndroid Build Coastguard Worker  * With further usages like `CAFFE_ENFORCE_THAT(IsVector(Input(0).dims()))`
188*da0073e9SAndroid Build Coastguard Worker  *
189*da0073e9SAndroid Build Coastguard Worker  * Convenient wrappers for binary operations like CAFFE_ENFORCE_EQ are provided
190*da0073e9SAndroid Build Coastguard Worker  * too. Please use them instead of TORCH_CHECK_EQ and friends for failures in
191*da0073e9SAndroid Build Coastguard Worker  * user-provided input.
192*da0073e9SAndroid Build Coastguard Worker  */
193*da0073e9SAndroid Build Coastguard Worker 
194*da0073e9SAndroid Build Coastguard Worker namespace enforce_detail {
195*da0073e9SAndroid Build Coastguard Worker 
196*da0073e9SAndroid Build Coastguard Worker template <typename T1, typename T2>
enforceFailMsgImpl(const T1 & x,const T2 & y)197*da0073e9SAndroid Build Coastguard Worker std::string enforceFailMsgImpl(const T1& x, const T2& y) {
198*da0073e9SAndroid Build Coastguard Worker   return c10::str(x, " vs ", y);
199*da0073e9SAndroid Build Coastguard Worker }
200*da0073e9SAndroid Build Coastguard Worker 
201*da0073e9SAndroid Build Coastguard Worker template <typename T1, typename T2, typename... Args>
enforceFailMsgImpl(const T1 & x,const T2 & y,const Args &...args)202*da0073e9SAndroid Build Coastguard Worker std::string enforceFailMsgImpl(const T1& x, const T2& y, const Args&... args) {
203*da0073e9SAndroid Build Coastguard Worker   return c10::str(x, " vs ", y, ". ", args...);
204*da0073e9SAndroid Build Coastguard Worker }
205*da0073e9SAndroid Build Coastguard Worker 
206*da0073e9SAndroid Build Coastguard Worker template <typename Pred, typename T1, typename T2, typename GetFailMsgFunc>
enforceThatImpl(Pred p,const T1 & lhs,const T2 & rhs,const char * file,int line,const char * expr,const void * caller,GetFailMsgFunc getFailMsg)207*da0073e9SAndroid Build Coastguard Worker void enforceThatImpl(
208*da0073e9SAndroid Build Coastguard Worker     Pred p,
209*da0073e9SAndroid Build Coastguard Worker     const T1& lhs,
210*da0073e9SAndroid Build Coastguard Worker     const T2& rhs,
211*da0073e9SAndroid Build Coastguard Worker     const char* file,
212*da0073e9SAndroid Build Coastguard Worker     int line,
213*da0073e9SAndroid Build Coastguard Worker     const char* expr,
214*da0073e9SAndroid Build Coastguard Worker     const void* caller,
215*da0073e9SAndroid Build Coastguard Worker     GetFailMsgFunc getFailMsg) {
216*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY(!(p(lhs, rhs)))) {
217*da0073e9SAndroid Build Coastguard Worker     ::c10::ThrowEnforceNotMet(file, line, expr, getFailMsg(lhs, rhs), caller);
218*da0073e9SAndroid Build Coastguard Worker   }
219*da0073e9SAndroid Build Coastguard Worker }
220*da0073e9SAndroid Build Coastguard Worker 
221*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_THAT_IMPL(op, lhs, rhs, expr, ...)  \
222*da0073e9SAndroid Build Coastguard Worker   ::c10::enforce_detail::enforceThatImpl(                 \
223*da0073e9SAndroid Build Coastguard Worker       op,                                                 \
224*da0073e9SAndroid Build Coastguard Worker       (lhs),                                              \
225*da0073e9SAndroid Build Coastguard Worker       (rhs),                                              \
226*da0073e9SAndroid Build Coastguard Worker       __FILE__,                                           \
227*da0073e9SAndroid Build Coastguard Worker       __LINE__,                                           \
228*da0073e9SAndroid Build Coastguard Worker       expr,                                               \
229*da0073e9SAndroid Build Coastguard Worker       nullptr,                                            \
230*da0073e9SAndroid Build Coastguard Worker       [&](const auto& arg1, const auto& arg2) {           \
231*da0073e9SAndroid Build Coastguard Worker         return ::c10::enforce_detail::enforceFailMsgImpl( \
232*da0073e9SAndroid Build Coastguard Worker             arg1, arg2, ##__VA_ARGS__);                   \
233*da0073e9SAndroid Build Coastguard Worker       })
234*da0073e9SAndroid Build Coastguard Worker 
235*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_THAT_IMPL_WITH_CALLER(op, lhs, rhs, expr, ...) \
236*da0073e9SAndroid Build Coastguard Worker   ::c10::enforce_detail::enforceThatImpl(                            \
237*da0073e9SAndroid Build Coastguard Worker       op,                                                            \
238*da0073e9SAndroid Build Coastguard Worker       (lhs),                                                         \
239*da0073e9SAndroid Build Coastguard Worker       (rhs),                                                         \
240*da0073e9SAndroid Build Coastguard Worker       __FILE__,                                                      \
241*da0073e9SAndroid Build Coastguard Worker       __LINE__,                                                      \
242*da0073e9SAndroid Build Coastguard Worker       expr,                                                          \
243*da0073e9SAndroid Build Coastguard Worker       this,                                                          \
244*da0073e9SAndroid Build Coastguard Worker       [&](const auto& arg1, const auto& arg2) {                      \
245*da0073e9SAndroid Build Coastguard Worker         return ::c10::enforce_detail::enforceFailMsgImpl(            \
246*da0073e9SAndroid Build Coastguard Worker             arg1, arg2, ##__VA_ARGS__);                              \
247*da0073e9SAndroid Build Coastguard Worker       })
248*da0073e9SAndroid Build Coastguard Worker 
249*da0073e9SAndroid Build Coastguard Worker } // namespace enforce_detail
250*da0073e9SAndroid Build Coastguard Worker 
251*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_THAT(cmp, op, lhs, rhs, ...) \
252*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_THAT_IMPL(cmp, lhs, rhs, #lhs " " #op " " #rhs, ##__VA_ARGS__)
253*da0073e9SAndroid Build Coastguard Worker 
254*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_BINARY_OP(cmp, op, x, y, ...) \
255*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_THAT_IMPL(cmp, x, y, #x " " #op " " #y, ##__VA_ARGS__)
256*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_EQ(x, y, ...) \
257*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP(std::equal_to<void>(), ==, x, y, ##__VA_ARGS__)
258*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_NE(x, y, ...) \
259*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP(std::not_equal_to<void>(), !=, x, y, ##__VA_ARGS__)
260*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_LE(x, y, ...) \
261*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP(std::less_equal<void>(), <=, x, y, ##__VA_ARGS__)
262*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_LT(x, y, ...) \
263*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP(std::less<void>(), <, x, y, ##__VA_ARGS__)
264*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_GE(x, y, ...) \
265*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP(std::greater_equal<void>(), >=, x, y, ##__VA_ARGS__)
266*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_GT(x, y, ...) \
267*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP(std::greater<void>(), >, x, y, ##__VA_ARGS__)
268*da0073e9SAndroid Build Coastguard Worker 
269*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_BINARY_OP_WITH_CALLER(cmp, op, x, y, ...) \
270*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_THAT_IMPL_WITH_CALLER(                          \
271*da0073e9SAndroid Build Coastguard Worker       cmp, x, y, #x " " #op " " #y, ##__VA_ARGS__)
272*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_EQ_WITH_CALLER(x, y, ...) \
273*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP_WITH_CALLER(          \
274*da0073e9SAndroid Build Coastguard Worker       std::equal_to<void>(), ==, x, y, ##__VA_ARGS__)
275*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_NE_WITH_CALLER(x, y, ...) \
276*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP_WITH_CALLER(          \
277*da0073e9SAndroid Build Coastguard Worker       std::not_equal_to<void>(), !=, x, y, ##__VA_ARGS__)
278*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_LE_WITH_CALLER(x, y, ...) \
279*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP_WITH_CALLER(          \
280*da0073e9SAndroid Build Coastguard Worker       std::less_equal<void>(), <=, x, y, ##__VA_ARGS__)
281*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_LT_WITH_CALLER(x, y, ...) \
282*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP_WITH_CALLER(std::less<void>(), <, x, y, ##__VA_ARGS__)
283*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_GE_WITH_CALLER(x, y, ...) \
284*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP_WITH_CALLER(          \
285*da0073e9SAndroid Build Coastguard Worker       std::greater_equal<void>(), >=, x, y, ##__VA_ARGS__)
286*da0073e9SAndroid Build Coastguard Worker #define CAFFE_ENFORCE_GT_WITH_CALLER(x, y, ...) \
287*da0073e9SAndroid Build Coastguard Worker   CAFFE_ENFORCE_BINARY_OP_WITH_CALLER(          \
288*da0073e9SAndroid Build Coastguard Worker       std::greater<void>(), >, x, y, ##__VA_ARGS__)
289*da0073e9SAndroid Build Coastguard Worker 
290*da0073e9SAndroid Build Coastguard Worker struct IValue;
291*da0073e9SAndroid Build Coastguard Worker class C10_API EventSampledHandler {
292*da0073e9SAndroid Build Coastguard Worker  public:
293*da0073e9SAndroid Build Coastguard Worker   virtual void log(
294*da0073e9SAndroid Build Coastguard Worker       std::string_view model_id,
295*da0073e9SAndroid Build Coastguard Worker       const std::vector<c10::IValue>& args) = 0;
296*da0073e9SAndroid Build Coastguard Worker   virtual ~EventSampledHandler() = default;
297*da0073e9SAndroid Build Coastguard Worker };
298*da0073e9SAndroid Build Coastguard Worker 
299*da0073e9SAndroid Build Coastguard Worker #define C10_LOG_EVENT_SAMPLED(event, ...)                                    \
300*da0073e9SAndroid Build Coastguard Worker   static const std::unique_ptr<::c10::EventSampledHandler>&                  \
301*da0073e9SAndroid Build Coastguard Worker       _##event##EventSampledHandler = ::c10::GetEventSampledHandler(#event); \
302*da0073e9SAndroid Build Coastguard Worker   if (_##event##EventSampledHandler) {                                       \
303*da0073e9SAndroid Build Coastguard Worker     _##event##EventSampledHandler->log(__VA_ARGS__);                         \
304*da0073e9SAndroid Build Coastguard Worker   }
305*da0073e9SAndroid Build Coastguard Worker 
306*da0073e9SAndroid Build Coastguard Worker // Must be called in the main thread before any other threads are spawned.
307*da0073e9SAndroid Build Coastguard Worker C10_API void InitEventSampledHandlers(
308*da0073e9SAndroid Build Coastguard Worker     std::vector<
309*da0073e9SAndroid Build Coastguard Worker         std::pair<std::string_view, std::unique_ptr<EventSampledHandler>>>);
310*da0073e9SAndroid Build Coastguard Worker C10_API const std::unique_ptr<EventSampledHandler>& GetEventSampledHandler(
311*da0073e9SAndroid Build Coastguard Worker     std::string_view);
312*da0073e9SAndroid Build Coastguard Worker 
313*da0073e9SAndroid Build Coastguard Worker /**
314*da0073e9SAndroid Build Coastguard Worker  * Very lightweight logging for the first time API usage. It's beneficial for
315*da0073e9SAndroid Build Coastguard Worker  * tracking of individual functionality usage in larger applications.
316*da0073e9SAndroid Build Coastguard Worker  *
317*da0073e9SAndroid Build Coastguard Worker  * In order to ensure light-weightedness of logging, we utilize static variable
318*da0073e9SAndroid Build Coastguard Worker  * trick - LogAPIUsage will be invoked only once and further invocations will
319*da0073e9SAndroid Build Coastguard Worker  * just do an atomic check.
320*da0073e9SAndroid Build Coastguard Worker  *
321*da0073e9SAndroid Build Coastguard Worker  * Example:
322*da0073e9SAndroid Build Coastguard Worker  *   // Logs caller info with an arbitrary text event, if there is a usage.
323*da0073e9SAndroid Build Coastguard Worker  *   C10_LOG_API_USAGE_ONCE("my_api");
324*da0073e9SAndroid Build Coastguard Worker  */
325*da0073e9SAndroid Build Coastguard Worker #define C10_LOG_API_USAGE_ONCE(...)                        \
326*da0073e9SAndroid Build Coastguard Worker   C10_UNUSED static bool C10_ANONYMOUS_VARIABLE(logFlag) = \
327*da0073e9SAndroid Build Coastguard Worker       ::c10::detail::LogAPIUsageFakeReturn(__VA_ARGS__);
328*da0073e9SAndroid Build Coastguard Worker 
329*da0073e9SAndroid Build Coastguard Worker // API usage logging capabilities
330*da0073e9SAndroid Build Coastguard Worker C10_API void SetAPIUsageLogger(std::function<void(const std::string&)> logger);
331*da0073e9SAndroid Build Coastguard Worker C10_API void LogAPIUsage(const std::string& context);
332*da0073e9SAndroid Build Coastguard Worker 
333*da0073e9SAndroid Build Coastguard Worker C10_API void SetAPIUsageMetadataLogger(
334*da0073e9SAndroid Build Coastguard Worker     std::function<void(
335*da0073e9SAndroid Build Coastguard Worker         const std::string&,
336*da0073e9SAndroid Build Coastguard Worker         const std::map<std::string, std::string>& metadata_map)> logger);
337*da0073e9SAndroid Build Coastguard Worker C10_API void LogAPIUsageMetadata(
338*da0073e9SAndroid Build Coastguard Worker     const std::string& context,
339*da0073e9SAndroid Build Coastguard Worker     const std::map<std::string, std::string>& metadata_map);
340*da0073e9SAndroid Build Coastguard Worker 
341*da0073e9SAndroid Build Coastguard Worker // PyTorch ddp usage logging capabilities
342*da0073e9SAndroid Build Coastguard Worker // DDPLoggingData holds data that can be logged in applications
343*da0073e9SAndroid Build Coastguard Worker // for analysis and debugging. Data structure is defined in
344*da0073e9SAndroid Build Coastguard Worker // c10 directory so that it can be easily imported by both c10
345*da0073e9SAndroid Build Coastguard Worker // and torch files.
346*da0073e9SAndroid Build Coastguard Worker struct DDPLoggingData {
347*da0073e9SAndroid Build Coastguard Worker   // logging fields that are string types.
348*da0073e9SAndroid Build Coastguard Worker   std::map<std::string, std::string> strs_map;
349*da0073e9SAndroid Build Coastguard Worker   // logging fields that are int64_t types.
350*da0073e9SAndroid Build Coastguard Worker   std::map<std::string, int64_t> ints_map;
351*da0073e9SAndroid Build Coastguard Worker };
352*da0073e9SAndroid Build Coastguard Worker 
353*da0073e9SAndroid Build Coastguard Worker C10_API void SetPyTorchDDPUsageLogger(
354*da0073e9SAndroid Build Coastguard Worker     std::function<void(const DDPLoggingData&)> logger);
355*da0073e9SAndroid Build Coastguard Worker C10_API void LogPyTorchDDPUsage(const DDPLoggingData& ddpData);
356*da0073e9SAndroid Build Coastguard Worker 
357*da0073e9SAndroid Build Coastguard Worker namespace detail {
358*da0073e9SAndroid Build Coastguard Worker // Return value is needed to do the static variable initialization trick
359*da0073e9SAndroid Build Coastguard Worker C10_API bool LogAPIUsageFakeReturn(const std::string& context);
360*da0073e9SAndroid Build Coastguard Worker } // namespace detail
361*da0073e9SAndroid Build Coastguard Worker 
362*da0073e9SAndroid Build Coastguard Worker // Initializes the c10 logger.
363*da0073e9SAndroid Build Coastguard Worker C10_API void initLogging();
364*da0073e9SAndroid Build Coastguard Worker 
365*da0073e9SAndroid Build Coastguard Worker // Sets the rank, which will be included in log messages
366*da0073e9SAndroid Build Coastguard Worker C10_API void SetGlobalRank(int64_t rank);
367*da0073e9SAndroid Build Coastguard Worker 
368*da0073e9SAndroid Build Coastguard Worker } // namespace c10
369*da0073e9SAndroid Build Coastguard Worker 
370*da0073e9SAndroid Build Coastguard Worker #endif // C10_UTIL_LOGGING_H_
371