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;
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, ID, DESC, ALIAS, std::vector(), false)
944 
976 #define PARAM_VECTOR_OUT(T, ID, DESC, ALIAS) \
977  PARAM_OUT(std::vector, ID, DESC, ALIAS, std::vector(), false)
978 
1016 #define TUPLE_TYPE std::tuple
1017 #define PARAM_MATRIX_AND_INFO_IN(ID, DESC, ALIAS) \
1018  PARAM_IN(TUPLE_TYPE, ID, DESC, ALIAS, TUPLE_TYPE(), false)
1019 
1048 #define PARAM_MODEL_IN(TYPE, ID, DESC, ALIAS) \
1049  PARAM_MODEL(TYPE, ID, DESC, ALIAS, false, true)
1050 
1079 #define PARAM_MODEL_IN_REQ(TYPE, ID, DESC, ALIAS) \
1080  PARAM_MODEL(TYPE, ID, DESC, ALIAS, true, true)
1081 
1104 #define PARAM_MODEL_OUT(TYPE, ID, DESC, ALIAS) \
1105  PARAM_MODEL(TYPE, ID, DESC, ALIAS, false, false)
1106 
1129 #define PARAM_INT_IN_REQ(ID, DESC, ALIAS) \
1130  PARAM_IN(int, ID, DESC, ALIAS, 0, true)
1131 
1154 #define PARAM_DOUBLE_IN_REQ(ID, DESC, ALIAS) \
1155  PARAM_IN(double, ID, DESC, ALIAS, 0.0, true)
1156 
1179 #define PARAM_STRING_IN_REQ(ID, DESC, ALIAS) \
1180  PARAM_IN(std::string, ID, DESC, ALIAS, "", true)
1181 
1206 #define PARAM_VECTOR_IN_REQ(T, ID, DESC, ALIAS) \
1207  PARAM_IN(std::vector, ID, DESC, ALIAS, std::vector(), true);
1208 
1225 #ifdef __COUNTER__
1226  #define PARAM_IN(T, ID, DESC, ALIAS, DEF, REQ) \
1227  static mlpack::util::Option \
1228  JOIN(io_option_dummy_object_in_, __COUNTER__) \
1229  (DEF, ID, DESC, ALIAS, #T, REQ, true, false, testName);
1230 
1231  #define PARAM_OUT(T, ID, DESC, ALIAS, DEF, REQ) \
1232  static mlpack::util::Option \
1233  JOIN(io_option_dummy_object_out_, __COUNTER__) \
1234  (DEF, ID, DESC, ALIAS, #T, REQ, false, false, testName);
1235 
1236  #define PARAM_MATRIX(ID, DESC, ALIAS, REQ, TRANS, IN) \
1237  static mlpack::util::Option \
1238  JOIN(io_option_dummy_matrix_, __COUNTER__) \
1239  (arma::mat(), ID, DESC, ALIAS, "arma::mat", \
1240  REQ, IN, !TRANS, testName);
1241 
1242  #define PARAM_UMATRIX(ID, DESC, ALIAS, REQ, TRANS, IN) \
1243  static mlpack::util::Option> \
1244  JOIN(io_option_dummy_umatrix_, __COUNTER__) \
1245  (arma::Mat(), ID, DESC, ALIAS, "arma::Mat", \
1246  REQ, IN, !TRANS, testName);
1247 
1248  #define PARAM_COL(ID, DESC, ALIAS, REQ, TRANS, IN) \
1249  static mlpack::util::Option \
1250  JOIN(io_option_dummy_col_, __COUNTER__) \
1251  (arma::vec(), ID, DESC, ALIAS, "arma::vec", \
1252  REQ, IN, !TRANS, testName);
1253 
1254  #define PARAM_UCOL(ID, DESC, ALIAS, REQ, TRANS, IN) \
1255  static mlpack::util::Option> \
1256  JOIN(io_option_dummy_ucol_, __COUNTER__) \
1257  (arma::Col(), ID, DESC, ALIAS, "arma::Col", \
1258  REQ, IN, !TRANS, testName);
1259 
1260  #define PARAM_ROW(ID, DESC, ALIAS, REQ, TRANS, IN) \
1261  static mlpack::util::Option \
1262  JOIN(io_option_dummy_row_, __COUNTER__) \
1263  (arma::rowvec(), ID, DESC, ALIAS, "arma::rowvec", \
1264  REQ, IN, !TRANS, testName);
1265 
1266  #define PARAM_UROW(ID, DESC, ALIAS, REQ, TRANS, IN) \
1267  static mlpack::util::Option> \
1268  JOIN(io_option_dummy_urow_, __COUNTER__) \
1269  (arma::Row(), ID, DESC, ALIAS, "arma::Row", \
1270  REQ, IN, !TRANS, testName);
1271 
1272  // There are no uses of required models, so that is not an option to this
1273  // macro (it would be easy to add).
1274  #define PARAM_MODEL(TYPE, ID, DESC, ALIAS, REQ, IN) \
1275  static mlpack::util::Option \
1276  JOIN(io_option_dummy_model_, __COUNTER__) \
1277  (nullptr, ID, DESC, ALIAS, #TYPE, REQ, IN, false, testName);
1278 #else
1279  // We have to do some really bizarre stuff since __COUNTER__ isn't defined. I
1280  // don't think we can absolutely guarantee success, but it should be "good
1281  // enough". We use the __LINE__ macro and the type of the parameter to try
1282  // and get a good guess at something unique.
1283  #define PARAM_IN(T, ID, DESC, ALIAS, DEF, REQ) \
1284  static mlpack::util::Option \
1285  JOIN(JOIN(io_option_dummy_object_in_, __LINE__), opt) \
1286  (DEF, ID, DESC, ALIAS, #T, REQ, true, false, testName);
1287 
1288  #define PARAM_OUT(T, ID, DESC, ALIAS, DEF, REQ) \
1289  static mlpack::util::Option \
1290  JOIN(JOIN(io_option_dummy_object_out_, __LINE__), opt) \
1291  (DEF, ID, DESC, ALIAS, #T, REQ, false, false, testName);
1292 
1293  #define PARAM_MATRIX(ID, DESC, ALIAS, REQ, TRANS, IN) \
1294  static mlpack::util::Option \
1295  JOIN(JOIN(io_option_dummy_object_matrix_, __LINE__), opt) \
1296  (arma::mat(), ID, DESC, ALIAS, "arma::mat", REQ, IN, !TRANS, \
1297  testName);
1298 
1299  #define PARAM_UMATRIX(ID, DESC, ALIAS, REQ, TRANS, IN) \
1300  static mlpack::util::Option> \
1301  JOIN(JOIN(io_option_dummy_object_umatrix_, __LINE__), opt) \
1302  (arma::Mat(), ID, DESC, ALIAS, "arma::Mat", REQ, IN, \
1303  !TRANS, testName);
1304 
1305  #define PARAM_COL(ID, DESC, ALIAS, REQ, TRANS, IN) \
1306  static mlpack::util::Option \
1307  JOIN(io_option_dummy_object_col_, __LINE__) \
1308  (arma::vec(), ID, DESC, ALIAS, "arma::vec", REQ, IN, !TRANS, \
1309  testName);
1310 
1311  #define PARAM_UCOL(ID, DESC, ALIAS, REQ, TRANS, IN) \
1312  static mlpack::util::Option> \
1313  JOIN(io_option_dummy_object_ucol_, __LINE__) \
1314  (arma::Col(), ID, DESC, ALIAS, "arma::Col", REQ, IN, \
1315  !TRANS, testName);
1316 
1317  #define PARAM_ROW(ID, DESC, ALIAS, REQ, TRANS, IN) \
1318  static mlpack::util::Option \
1319  JOIN(io_option_dummy_object_row_, __LINE__) \
1320  (arma::rowvec(), ID, DESC, ALIAS, "arma::rowvec", REQ, IN, !TRANS, \
1321  testName);
1322 
1323  #define PARAM_UROW(ID, DESC, ALIAS, REQ, TRANS, IN) \
1324  static mlpack::util::Option> \
1325  JOIN(io_option_dummy_object_urow_, __LINE__) \
1326  (arma::Row(), ID, DESC, ALIAS, "arma::Row", REQ, IN, \
1327  !TRANS, testName);
1328 
1329  #define PARAM_MODEL(TYPE, ID, DESC, ALIAS, REQ, IN) \
1330  static mlpack::util::Option \
1331  JOIN(JOIN(io_option_dummy_object_model_, __LINE__), opt) \
1332  (nullptr, ID, DESC, ALIAS, #TYPE, REQ, IN, false, \
1333  testName);
1334 #endif
1335 
1336 #endif
Linear algebra utility functions, generally performed on matrices or vectors.
DatasetMapper< data::IncrementPolicy > DatasetInfo