Caffe2 - C++ API
A deep learning, cross platform ML framework
flags.h
Go to the documentation of this file.
1 
20 #ifndef CAFFE2_CORE_FLAGS_H_
21 #define CAFFE2_CORE_FLAGS_H_
22 
23 #include "caffe2/core/registry.h"
24 
25 namespace caffe2 {
29 void SetUsageMessage(const string& str);
30 
34 const char* UsageMessage();
35 
44 bool ParseCaffeCommandLineFlags(int* pargc, char*** pargv);
49 
50 } // namespace caffe2
51 
52 
54 // Below are gflags and non-gflags specific implementations.
56 
57 #ifdef CAFFE2_USE_GFLAGS
58 
59 #include <gflags/gflags.h>
60 
61 // gflags before 2.0 uses namespace google and after 2.1 uses namespace gflags.
62 // Using GFLAGS_GFLAGS_H_ to capture this change.
63 #ifndef GFLAGS_GFLAGS_H_
64 namespace gflags = google;
65 #endif // GFLAGS_GFLAGS_H_
66 
67 #define CAFFE2_GFLAGS_DEF_WRAPPER(type, name, default_value, help_str) \
68  DEFINE_##type(name, default_value, help_str); \
69  namespace caffe2 { \
70  using ::FLAGS_##name; \
71  }
72 
73 #define CAFFE2_DEFINE_int(name, default_value, help_str) \
74  CAFFE2_GFLAGS_DEF_WRAPPER(int32, name, default_value, help_str)
75 #define CAFFE2_DEFINE_int64(name, default_value, help_str) \
76  CAFFE2_GFLAGS_DEF_WRAPPER(int64, name, default_value, help_str)
77 #define CAFFE2_DEFINE_double(name, default_value, help_str) \
78  CAFFE2_GFLAGS_DEF_WRAPPER(double, name, default_value, help_str)
79 #define CAFFE2_DEFINE_bool(name, default_value, help_str) \
80  CAFFE2_GFLAGS_DEF_WRAPPER(bool, name, default_value, help_str)
81 #define CAFFE2_DEFINE_string(name, default_value, help_str) \
82  CAFFE2_GFLAGS_DEF_WRAPPER(string, name, default_value, help_str)
83 
84 // DECLARE_typed_var should be used in header files and in the global namespace.
85 #define CAFFE2_GFLAGS_DECLARE_WRAPPER(type, name) \
86  DECLARE_##type(name); \
87  namespace caffe2 { \
88  using ::FLAGS_##name; \
89  } // namespace caffe2
90 
91 #define CAFFE2_DECLARE_int(name) CAFFE2_GFLAGS_DECLARE_WRAPPER(int32, name)
92 #define CAFFE2_DECLARE_int64(name) CAFFE2_GFLAGS_DECLARE_WRAPPER(int64, name)
93 #define CAFFE2_DECLARE_double(name) CAFFE2_GFLAGS_DECLARE_WRAPPER(double, name)
94 #define CAFFE2_DECLARE_bool(name) CAFFE2_GFLAGS_DECLARE_WRAPPER(bool, name)
95 #define CAFFE2_DECLARE_string(name) CAFFE2_GFLAGS_DECLARE_WRAPPER(string, name)
96 
97 #else // CAFFE2_USE_GFLAGS
98 
99 namespace caffe2 {
100 
102  public:
103  Caffe2FlagParser() {}
104  bool success() { return success_; }
105 
106  protected:
107  template <typename T>
108  bool Parse(const string& content, T* value);
109  bool success_;
110 };
111 
112 CAFFE_DECLARE_REGISTRY(Caffe2FlagsRegistry, Caffe2FlagParser, const string&);
113 
114 } // namespace caffe2
115 
116 // The macros are defined outside the caffe2 namespace. In your code, you should
117 // write the CAFFE2_DEFINE_* and CAFFE2_DECLARE_* macros outside any namespace
118 // as well.
119 
120 #define CAFFE2_DEFINE_typed_var(type, name, default_value, help_str) \
121  namespace caffe2 { \
122  CAFFE2_EXPORT type FLAGS_##name = default_value; \
123  namespace { \
124  class Caffe2FlagParser_##name : public Caffe2FlagParser { \
125  public: \
126  explicit Caffe2FlagParser_##name(const string& content) { \
127  success_ = Caffe2FlagParser::Parse<type>(content, &FLAGS_##name); \
128  } \
129  }; \
130  } \
131  RegistererCaffe2FlagsRegistry g_Caffe2FlagsRegistry_##name( \
132  #name, \
133  Caffe2FlagsRegistry(), \
134  RegistererCaffe2FlagsRegistry::DefaultCreator<Caffe2FlagParser_##name>, \
135  "(" #type ", default " #default_value ") " help_str); \
136  }
137 
138 #define CAFFE2_DEFINE_int(name, default_value, help_str) \
139  CAFFE2_DEFINE_typed_var(int, name, default_value, help_str)
140 #define CAFFE2_DEFINE_int64(name, default_value, help_str) \
141  CAFFE2_DEFINE_typed_var(int64_t, name, default_value, help_str)
142 #define CAFFE2_DEFINE_double(name, default_value, help_str) \
143  CAFFE2_DEFINE_typed_var(double, name, default_value, help_str)
144 #define CAFFE2_DEFINE_bool(name, default_value, help_str) \
145  CAFFE2_DEFINE_typed_var(bool, name, default_value, help_str)
146 #define CAFFE2_DEFINE_string(name, default_value, help_str) \
147  CAFFE2_DEFINE_typed_var(string, name, default_value, help_str)
148 
149 // DECLARE_typed_var should be used in header files and in the global namespace.
150 #define CAFFE2_DECLARE_typed_var(type, name) \
151  namespace caffe2 { \
152  CAFFE2_IMPORT extern type FLAGS_##name; \
153  } // namespace caffe2
154 
155 #define CAFFE2_DECLARE_int(name) CAFFE2_DECLARE_typed_var(int, name)
156 #define CAFFE2_DECLARE_int64(name) CAFFE2_DECLARE_typed_var(int64_t, name)
157 #define CAFFE2_DECLARE_double(name) CAFFE2_DECLARE_typed_var(double, name)
158 #define CAFFE2_DECLARE_bool(name) CAFFE2_DECLARE_typed_var(bool, name)
159 #define CAFFE2_DECLARE_string(name) CAFFE2_DECLARE_typed_var(string, name)
160 
161 #endif // CAFFE2_USE_GFLAGS
162 
163 #endif // CAFFE2_CORE_FLAGS_H_
bool ParseCaffeCommandLineFlags(int *pargc, char ***pargv)
Parses the commandline flags.
Definition: flags.cc:55
const char * UsageMessage()
Returns the usage message for the commandline tool set by SetUsageMessage.
Definition: flags.cc:53
void SetUsageMessage(const string &str)
Sets the usage message when a commandline tool is called with "--help".
Definition: flags.cc:52
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...
bool CommandLineFlagsHasBeenParsed()
Checks if the commandline flags has already been passed.
Definition: flags.cc:139