AmpGen 2.1
Loading...
Searching...
No Matches
Utilities.h
Go to the documentation of this file.
1#ifndef AMPGEN_UTILITIES_H
2#define AMPGEN_UTILITIES_H
3
4#include <cxxabi.h>
5#include <stddef.h>
6#include <algorithm>
7#include <fstream>
8#include <functional>
9#include <map>
10#include <sstream>
11#include <string>
12#include <typeinfo>
13#include <vector>
14#include <future>
15#ifdef _OPENMP
16#include <omp.h>
17#endif
18
19#include "AmpGen/MsgService.h"
20#include "AmpGen/MetaUtils.h"
21
22namespace AmpGen {
23 template <typename iterator_type, typename functor_type>
24 std::string vectorToString(iterator_type begin, iterator_type end, const std::string &delim, functor_type fcn) {
25 std::stringstream ss;
26 if(begin == end) return "";
27 for(auto it = begin; it != end - 1; ++it) ss << fcn(*it) << delim;
28 ss << fcn(*(end - 1));
29 return ss.str();
30 }
31
32 template <typename tuple_t> std::string tupleToString(const tuple_t &tuple, const std::string &delim) {
33 std::stringstream ss;
34 for_each(tuple, [&ss, delim](auto &item) { ss << item << delim; });
35 return ss.str();
36 }
37
38 template <typename container_type, typename vtype = typename container_type::value_type, typename functor_type = std::function<vtype(const vtype &)>>
39 std::string vectorToString(const container_type &obj, const std::string &delim = "", const functor_type &f = [](const auto &arg) { return arg; }) {
40 return vectorToString(std::begin(obj), std::end(obj), delim, f);
41 }
42
43 template <typename T> std::vector<std::vector<T>> nCr(const T &n, const T &r) {
44 std::vector<bool> mask(n);
45 std::vector<std::vector<T>> combinations;
46 std::fill(mask.begin() + r, mask.end(), true);
47 do {
48 std::vector<T> perm;
49 for(T i = 0; i < n; ++i)
50 if(!mask[i]) perm.push_back(i);
51 combinations.push_back(perm);
52 } while(std::next_permutation(mask.begin(), mask.end()));
53 return combinations;
54 }
55
56 std::vector<std::string> vectorFromFile(const std::string &filename, const char ignoreLinesThatBeginWith = '#');
57
58 std::vector<std::string> split(const std::string &, char, bool = true);
59 std::vector<std::string> split(const std::string &, const std::vector<char> &, bool = false);
60
61 std::vector<size_t> findAll(const std::string &input, const std::string &ch);
62
63 std::map<size_t, std::string> vecFindAll(const std::string &input, const std::vector<std::string> &vCh);
64
65 size_t find_next_of(const std::string &input, const std::vector<std::string> &patterns, const size_t &begin = 0);
66
67 std::string replaceAll(const std::string &input, const std::string &toReplace, const std::string &replaceWith);
68 std::string replaceAll(const std::string &input, const std::vector<std::pair<std::string, std::string>> &rules);
69
70 unsigned int FNV1a_hash(const std::string &toHash);
71
72 std::vector<std::string> getItems(const std::string &tree, const std::vector<std::string> &brackets = {"{", "}"}, const std::string &seperator = ",");
73
74 void swapChars(std::string &arg, const char a, const char b);
75
76 unsigned int editDistance(const std::string &s1, const std::string &s2);
77
78 std::string round(const double &number, const unsigned int &nsf);
79
80 std::string numberWithError(const double &number, const double &error, const unsigned int &nDigits);
81
82 template <typename return_type> return_type lexical_cast(const std::string &word, bool &status);
83
84 /*
85{
86 WARNING("Only use specialised versions of this template (word = " << word << ", type = " << AmpGen::type_string<return_type>() << ") ");
87 status = 0;
88 return return_type();
89}
90*/
91 template <class... ARGS> std::string mysprintf(const std::string &format, ARGS &&...args) {
92 auto size = std::snprintf(nullptr, 0, format.c_str(), std::forward<ARGS>(args)...);
93 std::string output(size + 1, '\0');
94 std::snprintf(&output[0], size + 1, format.c_str(), std::forward<ARGS>(args)...);
95 return output.substr(0, output.size() - 1);
96 }
97
98 template <> double lexical_cast(const std::string &word, bool &status);
99 template <> unsigned int lexical_cast(const std::string &word, bool &status);
100 template <> std::string lexical_cast(const std::string &word, bool &status);
101 template <> float lexical_cast(const std::string &word, bool &status);
102 template <> bool lexical_cast(const std::string &word, bool &status);
103 template <> int lexical_cast(const std::string &word, bool &status);
104 template <> unsigned long int lexical_cast(const std::string &word, bool &status);
105 template <> long int lexical_cast(const std::string &word, bool &status);
106
107 template <typename functor_type> void processFile(const std::string &filename, functor_type &&toDo, const char ignoreLinesThatBeginWith = '#') {
108 std::string tmp;
109 std::ifstream inFile(filename.c_str());
110 while(inFile.good()) {
111 std::getline(inFile, tmp);
112 tmp.erase(std::remove_if(tmp.begin(), tmp.end(), [](const char c) { return c == '\r'; }), tmp.end());
113 if(ignoreLinesThatBeginWith != '\0' && (tmp.size() == 0 || tmp[0] == ignoreLinesThatBeginWith)) continue;
114 toDo(tmp);
115 }
116 inFile.close();
117 }
118
119 // calculate number of swaps required to reorder set, where swaps can have different exchange parities.
120 std::pair<size_t, int> minSwaps(const std::vector<size_t> &indices, const std::vector<int> &exchangeParities);
121
122 template <class iterator, class comparator> void parallel_sort(iterator begin, iterator end, const comparator &comp, const size_t &grainsize) {
123 const size_t len = end - begin;
124 if(len < grainsize)
125 std::sort(begin, end, comp);
126 else {
127 const auto middle = begin + len / 2;
128 auto future = std::async(parallel_sort<iterator, comparator>, begin, middle, comp, grainsize);
129 parallel_sort(middle, end, comp, grainsize);
130 future.wait();
131 std::inplace_merge(begin, middle, end, comp);
132 }
133 }
134
135 template <class iterator, class initial_value, class functor>
136 initial_value parallel_accumulate(iterator begin, iterator end, const initial_value &init, const functor &f) {
137 auto total = init;
138 auto size = end - begin;
139#ifdef _OPENMP
140#pragma omp parallel for reduction(+ : total)
141#endif
142 for(int it = 0; it < size; ++it) { total += f(*(begin + it)); }
143 return total;
144 }
145 template <typename return_type, typename contained_type>
146 std::function<return_type(const contained_type &)> arrayToFunctor(const std::vector<return_type> &values) {
147 return [values](const contained_type &event) -> return_type { return *(values.data() + event.index()); };
148 }
149
150 template <typename T> std::vector<std::vector<T>> all_combinations(const std::vector<std::vector<T>> &elements) {
151 int nc = 1;
152 for(const auto &s : elements) nc *= s.size();
153 std::vector<std::vector<T>> comb(nc, std::vector<T>(elements.size(), 0));
154 for(int i = 0; i != comb.size(); ++i) {
155 int counter = i;
156 for(int j = elements.size() - 1; j >= 0; --j) {
157 int t = counter % elements[j].size();
158 counter = (counter - t) / elements[j].size();
159 comb[i][j] = elements[j][t];
160 }
161 }
162 return comb;
163 }
164
165 template <class iterator> void parallel_sort(iterator begin, iterator end, const size_t &grainsize) {
166 typedef typename std::iterator_traits<iterator>::value_type value_type;
167 parallel_sort(begin, end, std::less<value_type>(), grainsize);
168 }
169
170 bool stringMatchesWildcard(const std::string &input, const std::string &wildcard_string, const char wildcard_character = '*');
171
172 bool isDir(const std::string &fname);
173 bool fileExists(const std::string &name);
174
175 std::vector<std::string> getListOfFiles(const std::string &directory, const std::string &patternString = "");
176
178 void printReleaseNotes(const std::string &fname);
179
180 std::string ltrim(std::string s);
181 std::string rtrim(std::string s);
182 std::string trim(const std::string &s);
183 std::string expandGlobals(std::string path);
184
185 std::ostream &bold_on(std::ostream &);
186 std::ostream &bold_off(std::ostream &);
187 std::ostream &italic_on(std::ostream &);
188 std::ostream &italic_off(std::ostream &);
189}
190#endif
void parallel_sort(iterator begin, iterator end, const comparator &comp, const size_t &grainsize)
Definition Utilities.h:122
size_t find_next_of(const std::string &input, const std::vector< std::string > &patterns, const size_t &begin=0)
std::string tupleToString(const tuple_t &tuple, const std::string &delim)
Definition Utilities.h:32
std::vector< size_t > findAll(const std::string &input, const std::string &ch)
bool isDir(const std::string &fname)
std::vector< std::string > getItems(const std::string &tree, const std::vector< std::string > &brackets={"{", "}"}, const std::string &seperator=",")
std::string vectorToString(iterator_type begin, iterator_type end, const std::string &delim, functor_type fcn)
Definition Utilities.h:24
bool stringMatchesWildcard(const std::string &input, const std::string &wildcard_string, const char wildcard_character=' *')
std::vector< std::string > split(const std::string &, char, bool=true)
void printReleaseNotes(const std::string &fname)
std::ostream & italic_off(std::ostream &)
std::pair< size_t, int > minSwaps(const std::vector< size_t > &indices, const std::vector< int > &exchangeParities)
std::vector< std::string > vectorFromFile(const std::string &filename, const char ignoreLinesThatBeginWith='#')
std::vector< std::string > getListOfFiles(const std::string &directory, const std::string &patternString="")
initial_value parallel_accumulate(iterator begin, iterator end, const initial_value &init, const functor &f)
Definition Utilities.h:136
std::function< return_type(const contained_type &)> arrayToFunctor(const std::vector< return_type > &values)
Definition Utilities.h:146
std::map< size_t, std::string > vecFindAll(const std::string &input, const std::vector< std::string > &vCh)
unsigned int FNV1a_hash(const std::string &toHash)
std::string round(const double &number, const unsigned int &nsf)
std::vector< std::vector< T > > all_combinations(const std::vector< std::vector< T > > &elements)
Definition Utilities.h:150
std::string numberWithError(const double &number, const double &error, const unsigned int &nDigits)
std::ostream & bold_on(std::ostream &)
void processFile(const std::string &filename, functor_type &&toDo, const char ignoreLinesThatBeginWith='#')
Definition Utilities.h:107
std::ostream & bold_off(std::ostream &)
std::string trim(const std::string &s)
std::string replaceAll(const std::string &input, const std::string &toReplace, const std::string &replaceWith)
std::string rtrim(std::string s)
std::vector< std::vector< T > > nCr(const T &n, const T &r)
Definition Utilities.h:43
void swapChars(std::string &arg, const char a, const char b)
bool fileExists(const std::string &name)
return_type lexical_cast(const std::string &word, bool &status)
std::string mysprintf(const std::string &format, ARGS &&...args)
Definition Utilities.h:91
std::ostream & italic_on(std::ostream &)
void printSplash()
std::enable_if_t< I==sizeof...(Tp), void > for_each(std::tuple< Tp... > &, FuncT)
Definition MetaUtils.h:36
unsigned int editDistance(const std::string &s1, const std::string &s2)
std::string expandGlobals(std::string path)
std::string ltrim(std::string s)