mlpack
param.hpp
Go to the documentation of this file.
1 
15 #ifndef MLPACK_CORE_UTIL_PARAM_HPP
16 #define MLPACK_CORE_UTIL_PARAM_HPP
17 
18 // Required forward declarations.
19 namespace mlpack {
20 namespace data {
21 
22 class IncrementPolicy;
23 
24 template<typename PolicyType, typename InputType>
25 class DatasetMapper;
26 
27 using DatasetInfo = DatasetMapper<IncrementPolicy, std::string>;
28 
29 } // namespace data
30 } // namespace mlpack
31 
37 // These are ugly, but necessary utility functions we must use to generate a
38 // unique identifier inside of the PARAM() module.
39 #define JOIN(x, y) JOIN_AGAIN(x, y)
40 #define JOIN_AGAIN(x, y) x ## y
41 
57 #define BINDING_NAME(NAME) static \
58  mlpack::util::ProgramName \
59  io_programname_dummy_object = mlpack::util::ProgramName(NAME);
60 
76 #define BINDING_SHORT_DESC(SHORT_DESC) static \
77  mlpack::util::ShortDescription \
78  io_programshort_desc_dummy_object = mlpack::util::ShortDescription( \
79  SHORT_DESC);
80 
98 #define BINDING_LONG_DESC(LONG_DESC) static \
99  mlpack::util::LongDescription \
100  io_programlong_desc_dummy_object = mlpack::util::LongDescription( \
101  []() { return std::string(LONG_DESC); });
102 
120 #ifdef __COUNTER__
121  #define BINDING_EXAMPLE(EXAMPLE) static \
122  mlpack::util::Example \
123  JOIN(io_programexample_dummy_object_, __COUNTER__) = \
124  mlpack::util::Example( \
125  []() { return(std::string(EXAMPLE)); });
126 #else
127  #define BINDING_EXAMPLE(EXAMPLE) static \
128  mlpack::util::Example \
129  JOIN(JOIN(io_programexample_dummy_object_, __LINE__), opt) = \
130  mlpack::util::Example( \
131  []() { return(std::string(EXAMPLE)); });
132 #endif
133 
157 #ifdef __COUNTER__
158  #define BINDING_SEE_ALSO(DESCRIPTION, LINK) static \
159  mlpack::util::SeeAlso \
160  JOIN(io_programsee_also_dummy_object_, __COUNTER__) = \
161  mlpack::util::SeeAlso(DESCRIPTION, LINK);
162 #else
163  #define BINDING_SEE_ALSO(DESCRIPTION, LINK) static \
164  mlpack::util::SeeAlso \
165  JOIN(JOIN(io_programsee_also_dummy_object_, __LINE__), opt) = \
166  mlpack::util::SeeAlso(DESCRIPTION, LINK);
167 #endif
168 
189 #define PARAM_FLAG(ID, DESC, ALIAS) \
190  PARAM_IN(bool, ID, DESC, ALIAS, false, false);
191 
217 #define PARAM_INT_IN(ID, DESC, ALIAS, DEF) \
218  PARAM_IN(int, ID, DESC, ALIAS, DEF, false)
219 
248 #define PARAM_INT_OUT(ID, DESC) \
249  PARAM_OUT(int, ID, DESC, "", 0, false)
250 
275 #define PARAM_DOUBLE_IN(ID, DESC, ALIAS, DEF) \
276  PARAM_IN(double, ID, DESC, ALIAS, DEF, false)
277 
306 #define PARAM_DOUBLE_OUT(ID, DESC) \
307  PARAM_OUT(double, ID, DESC, "", 0.0, false)
308 
335 #define PARAM_STRING_IN(ID, DESC, ALIAS, DEF) \
336  PARAM_IN(std::string, ID, DESC, ALIAS, DEF, false)
337 
367 #define PARAM_STRING_OUT(ID, DESC, ALIAS) \
368  PARAM_OUT(std::string, ID, DESC, ALIAS, "", false)
369 
395 #define PARAM_MATRIX_IN(ID, DESC, ALIAS) \
396  PARAM_MATRIX(ID, DESC, ALIAS, false, true, true)
397 
423 #define PARAM_MATRIX_IN_REQ(ID, DESC, ALIAS) \
424  PARAM_MATRIX(ID, DESC, ALIAS, true, true, true)
425 
456 #define PARAM_MATRIX_OUT(ID, DESC, ALIAS) \
457  PARAM_MATRIX(ID, DESC, ALIAS, false, true, false)
458 
485 #define PARAM_TMATRIX_IN(ID, DESC, ALIAS) \
486  PARAM_MATRIX(ID, DESC, ALIAS, false, false, true)
487 
515 #define PARAM_TMATRIX_IN_REQ(ID, DESC, ALIAS) \
516  PARAM_MATRIX(ID, DESC, ALIAS, true, false, true)
517 
550 #define PARAM_TMATRIX_OUT(ID, DESC, ALIAS) \
551  PARAM_MATRIX(ID, DESC, ALIAS, false, false, false)
552 
578 #define PARAM_UMATRIX_IN(ID, DESC, ALIAS) \
579  PARAM_UMATRIX(ID, DESC, ALIAS, false, true, true)
580 
607 #define PARAM_UMATRIX_IN_REQ(ID, DESC, ALIAS) \
608  PARAM_UMATRIX(ID, DESC, ALIAS, true, true, true)
609 
641 #define PARAM_UMATRIX_OUT(ID, DESC, ALIAS) \
642  PARAM_UMATRIX(ID, DESC, ALIAS, false, true, false)
643 
644 
670 #define PARAM_COL_IN(ID, DESC, ALIAS) \
671  PARAM_COL(ID, DESC, ALIAS, false, true, true)
672 
698 #define PARAM_COL_IN_REQ(ID, DESC, ALIAS) \
699  PARAM_COL(ID, DESC, ALIAS, true, true, true)
700 
726 #define PARAM_ROW_IN(ID, DESC, ALIAS) \
727  PARAM_ROW(ID, DESC, ALIAS, false, true, true)
728 
754 #define PARAM_UCOL_IN(ID, DESC, ALIAS) \
755  PARAM_UCOL(ID, DESC, ALIAS, false, true, true)
756 
783 #define PARAM_UROW_IN(ID, DESC, ALIAS) \
784  PARAM_UROW(ID, DESC, ALIAS, false, true, true)
785 
816 #define PARAM_COL_OUT(ID, DESC, ALIAS) \
817  PARAM_COL(ID, DESC, ALIAS, false, true, false)
818 
849 #define PARAM_ROW_OUT(ID, DESC, ALIAS) \
850  PARAM_ROW(ID, DESC, ALIAS, false, true, false)
851 
882 #define PARAM_UCOL_OUT(ID, DESC, ALIAS) \
883  PARAM_UCOL(ID, DESC, ALIAS, false, true, false)
884 
915 #define PARAM_UROW_OUT(ID, DESC, ALIAS) \
916  PARAM_UROW(ID, DESC, ALIAS, false, true, false)
917 
942 #define PARAM_VECTOR_IN(T, ID, DESC, ALIAS) \
943  PARAM_IN(std::vector<T>, ID, DESC, ALIAS, std::vector<T>(), false)
944 
976 #define PARAM_VECTOR_OUT(T, ID, DESC, ALIAS) \
977  PARAM_OUT(std::vector<T>, ID, DESC, ALIAS, std::vector<T>(), false)
978 
1016 #define TUPLE_TYPE std::tuple<mlpack::data::DatasetInfo, arma::mat>
1017 #define PARAM_MATRIX_AND_INFO_IN(ID, DESC, ALIAS) \
1018  PARAM(TUPLE_TYPE, ID, DESC, ALIAS, \
1019  "std::tuple<mlpack::data::DatasetInfo, arma::mat>", false, true, true, \
1020  TUPLE_TYPE())
1021 
1050 #define PARAM_MODEL_IN(TYPE, ID, DESC, ALIAS) \
1051  PARAM_MODEL(TYPE, ID, DESC, ALIAS, false, true)
1052 
1081 #define PARAM_MODEL_IN_REQ(TYPE, ID, DESC, ALIAS) \
1082  PARAM_MODEL(TYPE, ID, DESC, ALIAS, true, true)
1083 
1106 #define PARAM_MODEL_OUT(TYPE, ID, DESC, ALIAS) \
1107  PARAM_MODEL(TYPE, ID, DESC, ALIAS, false, false)
1108 
1131 #define PARAM_INT_IN_REQ(ID, DESC, ALIAS) \
1132  PARAM_IN(int, ID, DESC, ALIAS, 0, true)
1133 
1156 #define PARAM_DOUBLE_IN_REQ(ID, DESC, ALIAS) \
1157  PARAM_IN(double, ID, DESC, ALIAS, 0.0, true)
1158 
1181 #define PARAM_STRING_IN_REQ(ID, DESC, ALIAS) \
1182  PARAM_IN(std::string, ID, DESC, ALIAS, "", true)
1183 
1208 #define PARAM_VECTOR_IN_REQ(T, ID, DESC, ALIAS) \
1209  PARAM_IN(std::vector<T>, ID, DESC, ALIAS, std::vector<T>(), true);
1210 
1214 #define PARAM_IN(T, ID, DESC, ALIAS, DEF, REQ) \
1215  PARAM(T, ID, DESC, ALIAS, #T, REQ, true, false, DEF);
1216 
1217 #define PARAM_OUT(T, ID, DESC, ALIAS, DEF, REQ) \
1218  PARAM(T, ID, DESC, ALIAS, #T, REQ, false, false, DEF);
1219 
1220 #define PARAM_MATRIX(ID, DESC, ALIAS, REQ, TRANS, IN) \
1221  PARAM(arma::mat, ID, DESC, ALIAS, "arma::mat", REQ, IN, \
1222  TRANS, arma::mat());
1223 
1224 #define PARAM_UMATRIX(ID, DESC, ALIAS, REQ, TRANS, IN) \
1225  PARAM(arma::Mat<size_t>, ID, DESC, ALIAS, "arma::Mat<size_t>", \
1226  REQ, IN, TRANS, arma::Mat<size_t>());
1227 
1228 #define PARAM_COL(ID, DESC, ALIAS, REQ, TRANS, IN) \
1229  PARAM(arma::vec, ID, DESC, ALIAS, "arma::vec", REQ, IN, TRANS, \
1230  arma::vec());
1231 
1232 #define PARAM_UCOL(ID, DESC, ALIAS, REQ, TRANS, IN) \
1233  PARAM(arma::Col<size_t>, ID, DESC, ALIAS, "arma::Col<size_t>", \
1234  REQ, IN, TRANS, arma::Col<size_t>());
1235 
1236 #define PARAM_ROW(ID, DESC, ALIAS, REQ, TRANS, IN) \
1237  PARAM(arma::rowvec, ID, DESC, ALIAS, "arma::rowvec", REQ, IN, \
1238  TRANS, arma::rowvec());
1239 
1240 #define PARAM_UROW(ID, DESC, ALIAS, REQ, TRANS, IN) \
1241  PARAM(arma::Row<size_t>, ID, DESC, ALIAS, "arma::Row<size_t>", \
1242  REQ, IN, TRANS, arma::Row<size_t>());
1243 
1260 #ifdef __COUNTER__
1261  #define PARAM(T, ID, DESC, ALIAS, NAME, REQ, IN, TRANS, DEF) \
1262  static mlpack::util::Option<T> \
1263  JOIN(io_option_dummy_object_in_, __COUNTER__) \
1264  (DEF, ID, DESC, ALIAS, NAME, REQ, IN, !TRANS, testName);
1265 
1266  // There are no uses of required models, so that is not an option to this
1267  // macro (it would be easy to add).
1268  #define PARAM_MODEL(TYPE, ID, DESC, ALIAS, REQ, IN) \
1269  static mlpack::util::Option<TYPE*> \
1270  JOIN(io_option_dummy_model_, __COUNTER__) \
1271  (nullptr, ID, DESC, ALIAS, #TYPE, REQ, IN, false, testName);
1272 #else
1273  // We have to do some really bizarre stuff since __COUNTER__ isn't defined. I
1274  // don't think we can absolutely guarantee success, but it should be "good
1275  // enough". We use the __LINE__ macro and the type of the parameter to try
1276  // and get a good guess at something unique.
1277  #define PARAM(T, ID, DESC, ALIAS, NAME, REQ, IN, TRANS, DEF) \
1278  static mlpack::util::Option<T> \
1279  JOIN(JOIN(io_option_dummy_object_in_, __LINE__), opt) \
1280  (DEF, ID, DESC, ALIAS, NAME, REQ, IN, !TRANS, testName);
1281 
1282  #define PARAM_MODEL(TYPE, ID, DESC, ALIAS, REQ, IN) \
1283  static mlpack::util::Option<TYPE*> \
1284  JOIN(JOIN(io_option_dummy_object_model_, __LINE__), opt) \
1285  (nullptr, ID, DESC, ALIAS, #TYPE, REQ, IN, false, \
1286  testName);
1287 #endif
1288 
1289 #endif
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1