MADNESS  0.10.1
commandlineparser.h
Go to the documentation of this file.
1 //
2 // Created by Florian Bischoff on 2/10/21.
3 //
4 
5 #ifndef MADNESS_COMMANDLINEPARSER_H
6 #define MADNESS_COMMANDLINEPARSER_H
7 
8 #include<map>
9 #include<algorithm>
10 namespace madness {
11 /// very simple command line parser
12 
13 /// parser reads out key/value pairs from the command line of the from --key=val or --key
14 /// currently no error handling, feel free to add.
16 
17  std::map<std::string, std::string> keyval;
18 
20  set_defaults();
21  }
22 
23  // parse command line arguments
24  // mp2 --mp2='maxiter 10; freeze 1' --dft:maxiter=20 --Xmpi:debug=true
25  commandlineparser(int argc, char **argv) {
26  set_defaults();
27  std::vector<std::string> allArgs_raw(argv, argv + argc);
28  allArgs_raw.erase(allArgs_raw.begin()); // first argument is the name of the binary
29  for (auto &a : allArgs_raw) {
30  // special treatment for the input file: no hyphens
33  std::replace_copy(a.begin(), a.end(), a.begin(), '=', ' ');
34  std::string key, val;
35  std::stringstream sa(a);
36  sa >> key;
37  val=a.substr(key.size());
38  if (key=="input") set_keyval("user_defined_input_file","1");
39  set_keyval(key,val);
40  }
41  }
42 
43  /// set default values from the command line
44  void set_defaults() {
45  keyval["input"]="input";
46 // keyval["geometry"]="input_file";
47  }
48 
49  void print_map() const {
50  for (auto&[key, val] : keyval) {
51  printf("%20s %20s \n", key.c_str(), val.c_str());
52  }
53  }
54 
55  bool key_exists(std::string key) const {
56  return (keyval.count(tolower(key))==1);
57  }
58 
59  std::string value(const std::string key) const {
61  return keyval.find(tolower(key))->second;
62  }
63 
64  void set_keyval(const std::string key, const std::string value) {
66  }
67 
68 public:
69 
70  /// special option: the input file has no hyphens in front and is just a value
71  std::string check_for_input_file(std::string line) {
72  if (line[0]=='-') return line;
73  auto words=split(line,"=");
74  if (words.size()==1) line="input="+line;
75  return line;
76  }
77  /// make lower case
78  static std::string tolower(std::string s) {
79  std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c){ return std::tolower(c); });
80  return s;
81  }
82 
83  /// split a string s into a vector of strings, using delimiter
84 
85  /// @param[in] s the string (pass by value!)
86  static std::vector<std::string> split(std::string s, const std::string delimiter) {
87  std::size_t pos = 0;
88  std::string token;
89  std::vector<std::string> result;
90  while ((pos = s.find(delimiter)) != std::string::npos) {
91  token = s.substr(0, pos);
92  result.push_back(token);
93  s.erase(0, pos + delimiter.length());
94  }
95  result.push_back(s);
96  return result;
97  }
98 
99  static std::string remove_front_hyphens(const std::string arg) {
100  std::size_t first=arg.find_first_not_of('-');
101  return arg.substr(first);
102  }
103 
104  static std::string remove_first_equal(const std::string arg) {
105  std::string result=arg;
106  const std::string item="=";
107  const std::string blank=" ";
108  auto it=std::find_first_of(result.begin(),result.end(),item.begin(),item.end());
109  std::replace(it,it+1,item.front(),blank.front());
110  return result;
111  }
112 
113  /// remove all blanks
114  static std::string remove_blanks(const std::string arg) {
115  std::string str2 = arg;
116  str2.erase(std::remove_if(str2.begin(), str2.end(),
117  [](unsigned char x){return std::isspace(x);}),str2.end());
118  return str2;
119  }
120 
121  /// remove blanks at the beginning and the end only
122  static std::string trim_blanks(const std::string arg) {
123  if (arg.size()==0) return arg;
124  std::size_t first=arg.find_first_not_of(' ');
125  std::size_t last=arg.find_last_not_of(' ');
126  return arg.substr(first,last-first+1);
127  }
128 
129  static std::string base_name(std::string const & path, std::string const & delims = "/")
130  {
131  return path.substr(path.find_last_of(delims) + 1);
132  }
133 
134  static std::string remove_extension(std::string const & filename)
135  {
136  std::size_t p=filename.find_last_of('.');
137  return p > 0 && p != std::string::npos ? filename.substr(0, p) : filename;
138  }
139 
140 };
141 }
142 #endif //MADNESS_COMMANDLINEPARSER_H
char * p(char *buf, const char *name, int k, int initial_level, double thresh, int order)
Definition: derivatives.cc:72
std::filesystem::path path
Definition: excited_state_calc.cpp:25
std::vector< Fcwf > transform(World &world, std::vector< Fcwf > &a, Tensor< std::complex< double >> U)
Definition: fcwf.cc:477
Tensor< typename Tensor< T >::scalar_type > arg(const Tensor< T > &t)
Return a new tensor holding the argument of each element of t (complex types only)
Definition: tensor.h:2502
#define MADNESS_CHECK(condition)
Check a condition — even in a release build the condition is always evaluated so it can have side eff...
Definition: madness_exception.h:190
File holds all helper structures necessary for the CC_Operator and CC2 class.
Definition: DFParameters.h:10
static const char * filename
Definition: legendre.cc:96
static const double a
Definition: nonlinschro.cc:118
static const double c
Definition: relops.cc:10
very simple command line parser
Definition: commandlineparser.h:15
static std::string trim_blanks(const std::string arg)
remove blanks at the beginning and the end only
Definition: commandlineparser.h:122
std::string value(const std::string key) const
Definition: commandlineparser.h:59
void set_keyval(const std::string key, const std::string value)
Definition: commandlineparser.h:64
static std::vector< std::string > split(std::string s, const std::string delimiter)
split a string s into a vector of strings, using delimiter
Definition: commandlineparser.h:86
bool key_exists(std::string key) const
Definition: commandlineparser.h:55
std::map< std::string, std::string > keyval
Definition: commandlineparser.h:17
static std::string base_name(std::string const &path, std::string const &delims="/")
Definition: commandlineparser.h:129
static std::string tolower(std::string s)
make lower case
Definition: commandlineparser.h:78
void set_defaults()
set default values from the command line
Definition: commandlineparser.h:44
commandlineparser(int argc, char **argv)
Definition: commandlineparser.h:25
static std::string remove_first_equal(const std::string arg)
Definition: commandlineparser.h:104
static std::string remove_extension(std::string const &filename)
Definition: commandlineparser.h:134
static std::string remove_blanks(const std::string arg)
remove all blanks
Definition: commandlineparser.h:114
commandlineparser()
Definition: commandlineparser.h:19
std::string check_for_input_file(std::string line)
special option: the input file has no hyphens in front and is just a value
Definition: commandlineparser.h:71
void print_map() const
Definition: commandlineparser.h:49
static std::string remove_front_hyphens(const std::string arg)
Definition: commandlineparser.h:99