23#ifdef __cpp_lib_execution
28 template<sp_i IT, std::invocable<IT> F>
void for_each(
const IT start,
const IT
end, F&& FN) {
30 static tbb::affinity_partitioner ap;
31 tbb::parallel_for(start,
end, std::forward<F>(FN), ap);
33 for(IT I = start; I <
end; ++I) FN(I);
37 template<sp_i IT, std::invocable<IT> F>
void for_each(
const IT
end, F&& FN) {
return for_each(
static_cast<IT
>(0),
end, std::forward<F>(FN)); }
40#ifdef __cpp_lib_execution
41 return std::max_element(std::execution::par, start,
end);
43 return std::max_element(start,
end);
47 template<
typename T> [[maybe_unused]]
const std::vector<T>&
unique(std::vector<T>& container) {
48 std::sort(container.begin(), container.end());
49 container.erase(std::unique(container.begin(), container.end()), container.end());
50 container.shrink_to_fit();
54 template<
typename T>
constexpr T&
hacker(
const T& I) {
return const_cast<T&
>(I); }
56 template<
typename T>
constexpr T*&
hacker(
const T*
const& I) {
return const_cast<T*&
>(I); }
58 template<
typename T>
T sign(
const T& I) {
return (I >
T(0)) - (I <
T(0)); }
60 template<
typename T>
constexpr T clamp(
T c,
T a,
T b) {
61 if(a > b) std::swap(a, b);
62 return std::max(a, std::min(b, c));
67 template<
typename T>
bool approx_equal(
T x,
T y,
int ulp = 2)
requires(!std::numeric_limits<T>::is_integer) {
return fabs(x - y) <= std::numeric_limits<T>::epsilon() * fabs(x + y) * ulp || fabs(x - y) < std::numeric_limits<T>::min(); }
69 unsigned long long binomial(
unsigned long long,
unsigned long long);
76 std::string
to_upper(
const std::string&);
77 std::string
to_lower(
const std::string&);
81 namespace expression {
82 std::vector<std::pair<std::string, unsigned>>
split(std::string_view variable_string);
86template<
typename T>
bool get_input(std::istringstream& I,
T& O) {
return static_cast<bool>(I >> O); }
88template<
typename T>
bool get_input(std::istringstream& I, Col<T>& O) {
90 for(
auto&
P : O) code &=
static_cast<bool>(I >>
P);
94template<
typename T,
typename...
U>
bool get_input(std::istringstream& I,
T& O,
U&... R) {
return static_cast<bool>(I >> O) ?
get_input(I, R...) :
false; }
105 if(I.eof())
return true;
107 return static_cast<bool>(I >> O);
112 for(
auto&
P : O) code &= I.eof() ? true :
static_cast<bool>(I >>
P);
117 if(I.eof())
return true;
125 while(
get_input(I, value)) O.emplace_back(value);
129template<
typename T1,
typename T2>
auto get_remaining(std::istringstream& I) {
138 return std::make_tuple(O1, O2);
141template<
typename T1,
typename T2,
typename T3>
auto get_remaining(std::istringstream& I) {
153 return std::make_tuple(O1, O2, O3);
156template<
typename T1,
typename T2,
typename T3,
typename T4>
auto get_remaining(std::istringstream& I) {
171 return std::make_tuple(O1, O2, O3, O4);
174template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
auto get_remaining(std::istringstream& I) {
192 return std::make_tuple(O1, O2, O3, O4, O5);
197bool is_equal(
const char*,
const char*);
200bool is_equal(
const std::string&,
const char*);
201bool is_equal(
const char*,
const std::string&);
202bool is_equal(
const std::string&,
const std::string&);
203bool is_equal(std::string_view,
const char*);
204bool is_equal(
const char*, std::string_view);
206bool if_contain(
const std::string&,
const char*);
207bool if_contain(
const std::string&,
const std::string&);
212template<std::equality_comparable T> std::pair<bool, std::int64_t>
if_contain(
const std::vector<T>& container,
const T target) {
213 auto position = std::find(container.begin(), container.end(), target);
215 return {position != container.end() && container.size() > 0, position - container.begin()};
220bool is_true(
const std::string&);
225double perturb(
double,
double = 1
E-5);
Storage< T >::iterator end(Storage< T > &S)
Definition Storage.hpp:208
std::vector< std::pair< std::string, unsigned > > split(std::string_view variable_string)
Definition utility.cpp:70
Definition SparseMatMAGMA.hpp:43
constexpr T clamp_unit(T c)
Definition utility.h:65
const std::vector< T > & unique(std::vector< T > &container)
Definition utility.h:47
char to_lower(char)
Definition utility.cpp:38
constexpr T clamp(T c, T a, T b)
Definition utility.h:60
T sign(const T &I)
Definition utility.h:58
unsigned long long binomial(unsigned long long, unsigned long long)
Definition utility.cpp:22
char to_upper(char)
Definition utility.cpp:36
constexpr T max_element(T start, T end)
Definition utility.h:39
bool approx_equal(T x, T y, int ulp=2)
Definition utility.h:67
void for_each(const IT start, const IT end, F &&FN)
Definition utility.h:28
constexpr T & hacker(const T &I)
Definition utility.h:54
bool if_startswith(std::string_view, std::string_view)
Definition utility.cpp:126
void ignore_whitespace(std::istringstream &)
Definition utility.cpp:93
bool is_integer(const std::string &)
Definition utility.cpp:143
bool get_optional_input(std::istringstream &I, T &O)
Definition utility.h:104
bool get_input(std::istringstream &I, T &O)
Definition utility.h:86
bool is_false(const char *)
Definition utility.cpp:137
auto get_remaining(std::istringstream &I)
Definition utility.h:122
double perturb(double, double=1E-5)
Definition utility.cpp:145
bool is_equal(const char *, const char *)
Definition utility.cpp:104
bool if_contain(const std::string &, const char *)
Definition utility.cpp:120
bool is_true(const char *)
Definition utility.cpp:135