mlpack 3.4.2
cli_option.hpp
Go to the documentation of this file.
1
13#ifndef MLPACK_CORE_BINDINGS_CLI_CLI_OPTION_HPP
14#define MLPACK_CORE_BINDINGS_CLI_CLI_OPTION_HPP
15
16#include <string>
17
19#include "parameter_type.hpp"
20#include "add_to_cli11.hpp"
21#include "default_param.hpp"
22#include "output_param.hpp"
24#include "string_type_param.hpp"
25#include "get_param.hpp"
26#include "get_raw_param.hpp"
28#include "set_param.hpp"
33#include "in_place_copy.hpp"
34
35namespace mlpack {
36namespace bindings {
37namespace cli {
38
47template<typename N>
49{
50 public:
68 CLIOption(const N defaultValue,
69 const std::string& identifier,
70 const std::string& description,
71 const std::string& alias,
72 const std::string& cppName,
73 const bool required = false,
74 const bool input = true,
75 const bool noTranspose = false,
76 const std::string& /*testName*/ = "")
77 {
78 // Create the ParamData object to give to CLI.
79 util::ParamData data;
80
81 data.desc = description;
82 data.name = identifier;
83 data.tname = TYPENAME(N);
84 data.alias = alias[0];
85 data.wasPassed = false;
86 data.noTranspose = noTranspose;
87 data.required = required;
88 data.input = input;
89 data.loaded = false;
90 data.persistent = false; // All CLI parameters are not persistent.
91 data.cppType = cppName;
92
93 // Apply default value.
94 if (std::is_same<typename std::remove_pointer<N>::type,
95 typename ParameterType<typename
96 std::remove_pointer<N>::type>::type>::value)
97 {
98 data.value = boost::any(defaultValue);
99 }
100 else
101 {
103 data.value = boost::any(std::tuple<N, decltype(tmp)>(defaultValue, tmp));
104 }
105
106 const std::string tname = data.tname;
107 const std::string cliName = MapParameterName<
108 typename std::remove_pointer<N>::type>(identifier);
109 std::string progOptId = (alias[0] != '\0') ?
110 "-" + std::string(1, alias[0]) + ",--" + cliName : "--" + cliName;
111
112 // Do a check to ensure that the boost name isn't already in use.
113 const std::map<std::string, util::ParamData>& parameters =
115 if (parameters.count(cliName) > 0)
116 {
117 // Create a fake Log::Fatal since it may not yet be initialized.
118 // Temporarily define color code escape sequences.
119 #ifndef _WIN32
120 #define BASH_RED "\033[0;31m"
121 #define BASH_CLEAR "\033[0m"
122 #else
123 #define BASH_RED ""
124 #define BASH_CLEAR ""
125 #endif
126
127 // Temporary outstream object for detecting duplicate identifiers.
128 util::PrefixedOutStream outstr(std::cerr,
129 BASH_RED "[FATAL] " BASH_CLEAR, false, true /* fatal */);
130
131 #undef BASH_RED
132 #undef BASH_CLEAR
133
134 outstr << "Parameter --" << cliName << " (" << data.alias << ") "
135 << "is defined multiple times with the same identifiers."
136 << std::endl;
137 }
138
139 IO::Add(std::move(data));
140
141 // Set some function pointers that we need.
142 IO::GetSingleton().functionMap[tname]["DefaultParam"] =
143 &DefaultParam<N>;
144 IO::GetSingleton().functionMap[tname]["OutputParam"] =
145 &OutputParam<N>;
146 IO::GetSingleton().functionMap[tname]["GetPrintableParam"] =
147 &GetPrintableParam<N>;
148 IO::GetSingleton().functionMap[tname]["StringTypeParam"] =
149 &StringTypeParam<N>;
150 IO::GetSingleton().functionMap[tname]["GetParam"] = &GetParam<N>;
151 IO::GetSingleton().functionMap[tname]["GetRawParam"] = &GetRawParam<N>;
152 IO::GetSingleton().functionMap[tname]["AddToCLI11"] = &AddToCLI11<N>;
153 IO::GetSingleton().functionMap[tname]["MapParameterName"] =
154 &MapParameterName<N>;
155 IO::GetSingleton().functionMap[tname]["GetPrintableParamName"] =
156 &GetPrintableParamName<N>;
157 IO::GetSingleton().functionMap[tname]["GetPrintableParamValue"] =
158 &GetPrintableParamValue<N>;
159 IO::GetSingleton().functionMap[tname]["GetAllocatedMemory"] =
160 &GetAllocatedMemory<N>;
161 IO::GetSingleton().functionMap[tname]["DeleteAllocatedMemory"] =
162 &DeleteAllocatedMemory<N>;
163 IO::GetSingleton().functionMap[tname]["InPlaceCopy"] = &InPlaceCopy<N>;
164 }
165};
166
167} // namespace cli
168} // namespace bindings
169} // namespace mlpack
170
171#endif
FunctionMapType functionMap
Definition: io.hpp:299
static IO & GetSingleton()
Retrieve the singleton.
static void Add(util::ParamData &&d)
Adds a parameter to the hierarchy; use the PARAM_*() macros instead of this (i.e.
static std::map< std::string, util::ParamData > & Parameters()
Return a modifiable list of parameters that IO knows about.
A static object whose constructor registers a parameter with the IO class.
Definition: cli_option.hpp:49
CLIOption(const N defaultValue, const std::string &identifier, const std::string &description, const std::string &alias, const std::string &cppName, const bool required=false, const bool input=true, const bool noTranspose=false, const std::string &="")
Construct an Option object.
Definition: cli_option.hpp:68
Allows us to output to an ostream with a prefix at the beginning of each line, in the same way we wou...
#define BASH_CLEAR
#define BASH_RED
std::string MapParameterName(const std::string &identifier, const typename boost::disable_if< arma::is_arma_type< T > >::type *=0, const typename boost::disable_if< data::HasSerialize< T > >::type *=0, const typename boost::disable_if< std::is_same< T, std::tuple< mlpack::data::DatasetInfo, arma::mat > > >::type *=0)
If needed, map the parameter name to the name that is used by CLI11.
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
#define TYPENAME(x)
The TYPENAME macro is used internally to convert a type into a string.
Definition: param_data.hpp:22
Utility struct to return the type that CLI11 should accept for a given input type.
This structure holds all of the information about a single parameter, including its value (which is s...
Definition: param_data.hpp:53
bool noTranspose
True if this is a matrix that should not be transposed.
Definition: param_data.hpp:69
char alias
Alias for this parameter.
Definition: param_data.hpp:63
std::string desc
Description of this parameter, if any.
Definition: param_data.hpp:58
bool wasPassed
True if the option was passed to the program.
Definition: param_data.hpp:66
boost::any value
The actual value that is held.
Definition: param_data.hpp:82
std::string tname
Type information of this parameter.
Definition: param_data.hpp:61
bool required
True if this option is required.
Definition: param_data.hpp:71
bool input
True if this option is an input option (otherwise, it is output).
Definition: param_data.hpp:73
bool loaded
If this is an input parameter that needs extra loading, this indicates whether or not it has been loa...
Definition: param_data.hpp:76
std::string name
Name of this parameter.
Definition: param_data.hpp:56
std::string cppType
The true name of the type, as it would be written in C++.
Definition: param_data.hpp:84
bool persistent
If this should be preserved across different settings (i.e.
Definition: param_data.hpp:79