1#ifndef AMPGEN_UTILITIES_H
2#define AMPGEN_UTILITIES_H
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) {
26 if(begin == end)
return "";
27 for(
auto it = begin; it != end - 1; ++it) ss <<
fcn(*it) << delim;
28 ss <<
fcn(*(end - 1));
32 template <
typename tuple_t> std::string
tupleToString(
const tuple_t &tuple,
const std::string &delim) {
34 for_each(tuple, [&ss, delim](
auto &item) { ss << item << delim; });
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; }) {
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);
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()));
56 std::vector<std::string>
vectorFromFile(
const std::string &filename,
const char ignoreLinesThatBeginWith =
'#');
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);
61 std::vector<size_t>
findAll(
const std::string &input,
const std::string &ch);
63 std::map<size_t, std::string>
vecFindAll(
const std::string &input,
const std::vector<std::string> &vCh);
65 size_t find_next_of(
const std::string &input,
const std::vector<std::string> &patterns,
const size_t &begin = 0);
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);
72 std::vector<std::string>
getItems(
const std::string &tree,
const std::vector<std::string> &brackets = {
"{",
"}"},
const std::string &seperator =
",");
74 void swapChars(std::string &arg,
const char a,
const char b);
76 unsigned int editDistance(
const std::string &s1,
const std::string &s2);
78 std::string
round(
const double &number,
const unsigned int &nsf);
80 std::string
numberWithError(
const double &number,
const double &error,
const unsigned int &nDigits);
82 template <
typename return_type> return_type
lexical_cast(
const std::string &word,
bool &status);
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);
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);
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);
107 template <
typename functor_type>
void processFile(
const std::string &filename, functor_type &&toDo,
const char ignoreLinesThatBeginWith =
'#') {
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;
120 std::pair<size_t, int>
minSwaps(
const std::vector<size_t> &indices,
const std::vector<int> &exchangeParities);
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;
125 std::sort(begin, end, comp);
127 const auto middle = begin + len / 2;
131 std::inplace_merge(begin, middle, end, comp);
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) {
138 auto size = end - begin;
140#pragma omp parallel for reduction(+ : total)
142 for(
int it = 0; it < size; ++it) { total += f(*(begin + it)); }
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()); };
150 template <
typename T> std::vector<std::vector<T>>
all_combinations(
const std::vector<std::vector<T>> &elements) {
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) {
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];
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);
170 bool stringMatchesWildcard(
const std::string &input,
const std::string &wildcard_string,
const char wildcard_character =
'*');
172 bool isDir(
const std::string &fname);
175 std::vector<std::string>
getListOfFiles(
const std::string &directory,
const std::string &patternString =
"");
182 std::string
trim(
const std::string &s);
void parallel_sort(iterator begin, iterator end, const comparator &comp, const size_t &grainsize)
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)
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)
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)
std::function< return_type(const contained_type &)> arrayToFunctor(const std::vector< return_type > &values)
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)
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='#')
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)
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)
std::ostream & italic_on(std::ostream &)
std::enable_if_t< I==sizeof...(Tp), void > for_each(std::tuple< Tp... > &, FuncT)
unsigned int editDistance(const std::string &s1, const std::string &s2)
std::string expandGlobals(std::string path)
std::string ltrim(std::string s)