24#if defined(_DEBUG) || defined(DEBUG) || !defined(NDEBUG)
26#define SUANPAN_EXTRA_DEBUG
32#define MKL_DIRECT_CALL
43#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) || defined(__WIN32__)
50#if defined(WIN64) || defined(_WIN64) || defined(__WIN64) || defined(__WIN64__)
63#if defined(unix) || defined(__unix__) || defined(__linux__) || defined(linux)
72#ifdef SUANPAN_COMPILER
73#undef SUANPAN_COMPILER
82#define SUANPAN_VERSION __VERSION__
83#ifdef SUANPAN_COMPILER
84#undef SUANPAN_COMPILER
86#define SUANPAN_COMPILER "CLANG"
88#elif defined(__GNUG__)
90#define SUANPAN_VERSION __VERSION__
91#define SUANPAN_COMPILER "GCC"
93#elif defined(_MSC_BUILD)
95#define SUANPAN_VERSION _MSC_FULL_VER
96#define SUANPAN_COMPILER "MSVC"
99#pragma warning(disable : 4068)
101#pragma warning(disable : 4505)
103#pragma warning(disable : 4127)
106#define SUANPAN_VERSION __ICC
107#define SUANPAN_COMPILER "INTEL"
117#define SUANPAN_VERSION __ICL
118#define SUANPAN_COMPILER "INTEL"
137#define SUANPAN_IMPORT extern "C" __declspec(dllimport)
139#define SUANPAN_EXPORT extern "C" __declspec(dllexport)
140#elif defined(SUANPAN_UNIX)
142#define SUANPAN_IMPORT extern "C"
144#define SUANPAN_EXPORT extern "C"
147#define SUANPAN_IMPORT extern "C"
148#define SUANPAN_EXPORT extern "C"
171#define _strcmpi strcasecmp
175#include <oneapi/tbb/parallel_for_each.h>
176#include <oneapi/tbb/parallel_sort.h>
177#define suanpan_sort tbb::parallel_sort
178#define suanpan_for_each tbb::parallel_for_each
180#define suanpan_sort std::sort
181#define suanpan_for_each std::for_each
190#define ARMA_COUT_STREAM SUANPAN_COUT
191#define ARMA_CERR_STREAM SUANPAN_COUT
193#include <armadillo/arma>
197namespace fs = std::filesystem;
199#ifdef SUANPAN_DISTRIBUTED
200#include <mpl/mpl.hpp>
202inline auto& comm_world{mpl::environment::comm_world()};
203inline const auto comm_rank{comm_world.rank()};
204inline const auto comm_size{comm_world.size()};
206template<
typename T>
concept mpl_floating_t = std::is_same_v<T, float> || std::is_same_v<T, double>;
207template<
typename T>
concept mpl_complex_t = std::is_same_v<T, std::complex<typename T::value_type>> && mpl_floating_t<typename T::value_type>;
208template<
typename T>
concept mpl_data_t = mpl_floating_t<T> || mpl_complex_t<T>;
210template<
typename T>
requires std::is_arithmetic_v<T>
auto bcast_from_root(T
object) {
211 comm_world.bcast(0,
object);
216 comm_world.bcast(0,
const_cast<T*
>(
object.memptr()), mpl::contiguous_layout<T>{
object.n_elem});
220template<
typename T>
requires std::is_arithmetic_v<T>
auto allreduce(T
object) {
221 comm_world.allreduce(mpl::plus<T>(),
object);
225template<mpl_data_t T>
auto&
allreduce(
const Mat<T>&
object) {
226 comm_world.allreduce(mpl::plus<T>(),
const_cast<T*
>(
object.memptr()), mpl::contiguous_layout<T>{
object.n_elem});
230template<mpl_data_t T>
auto&
reduce(
const Mat<T>&
object) {
231 comm_world.reduce(mpl::plus<T>(), 0,
const_cast<T*
>(
object.memptr()), mpl::contiguous_layout<T>{
object.n_elem});
238template<
typename T>
auto bcast_from_root(T&&
object) {
return std::forward<T>(
object); }
240template<
typename T>
auto allreduce(T&&
object) {
return std::forward<T>(
object); }
242template<
typename T>
auto reduce(T&&
object) {
return std::forward<T>(
object); }
245#include <fmt/color.h>
251 inline std::string
pattern(
const std::string_view header,
const std::string_view file_path,
const std::string_view
format) {
259 const auto pos = file_path.find_last_of(
"/\\");
260 pattern.append(fmt::format(
"[{}] {}:{{}} ~> {}", header, pos == std::string_view::npos ? file_path : file_path.substr(pos + 1),
format));
265 template<
typename... T>
void debug(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
269 else SUANPAN_COUT << fmt::vformat(
pattern(
"DEBUG", file_name, format_str), fmt::make_format_args(line, args...));
272 template<
typename... T>
void warning(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
276 if(
SUANPAN_COLOR)
SUANPAN_CWRN << fmt::vformat(fg(fmt::color::slate_blue),
pattern(
"WARNING", file_name, format_str), fmt::make_format_args(line, args...));
277 else SUANPAN_CWRN << fmt::vformat(
pattern(
"WARNING", file_name, format_str), fmt::make_format_args(line, args...));
280 template<
typename... T>
void error(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
285 else SUANPAN_CERR << fmt::vformat(
pattern(
"ERROR", file_name, format_str), fmt::make_format_args(line, args...));
288 template<
typename... T>
void fatal(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
292 else SUANPAN_CFTL << fmt::vformat(
pattern(
"FATAL", file_name, format_str), fmt::make_format_args(line, args...));
295 template<
typename... T>
void info(
const std::string_view format_sv,
const T&... args) {
299 else SUANPAN_COUT << fmt::vformat(format_sv, fmt::make_format_args(args...));
302 template<
typename... T> std::string
format(
const std::string_view format_str,
const T&... args) {
return fmt::vformat(format_str, fmt::make_format_args(args...)); }
304 template<
typename T> std::string
format(
const Col<T>& in_vec) {
306 if(std::is_floating_point_v<T>)
307 for(
const auto I : in_vec) output.append(
format(
" {: 1.4e}", I));
309 for(
const auto I : in_vec) output.append(
format(
" {:6d}", I));
310 output.push_back(
'\n');
314 template<
typename T>
void info(
const Col<T>& in_vec) {
321 template<
typename T>
void info(
const std::string_view format_sv,
const Col<T>& in_vec) {
323 std::string output{
format(format_sv)};
324 if(format_sv.back() !=
'\t' && format_sv.back() !=
'\n') output +=
'\n';
331 template<
typename... T>
void highlight(
const std::string_view format_sv,
const T&... args) {
335 else SUANPAN_COUT << fmt::vformat(format_sv, fmt::make_format_args(args...));
341 std::forward<F>(handler)();
345#define suanpan_info suanpan::info
346#define suanpan_highlight suanpan::highlight
347#define suanpan_debug(...) suanpan::debug(__FILE__, __LINE__, ##__VA_ARGS__)
348#define suanpan_warning(...) suanpan::warning(__FILE__, __LINE__, ##__VA_ARGS__)
349#define suanpan_error(...) suanpan::error(__FILE__, __LINE__, ##__VA_ARGS__)
350#define suanpan_fatal(...) suanpan::fatal(__FILE__, __LINE__, ##__VA_ARGS__)
354using std::shared_ptr;
355using std::unique_ptr;
357template<
class T>
concept sp_d = std::is_same_v<T, float> || std::is_same_v<T, double>;
358template<
class T>
concept sp_i = std::is_integral_v<T>;
360template<
typename T,
typename U>
concept is_arma_mat =
sp_d<T> && (std::is_convertible_v<std::remove_cvref_t<U>, Mat<T>> || std::is_convertible_v<std::remove_cvref_t<U>, SpMat<T>>);
363 template<
class Container,
class Handler>
requires requires(Container& x) { x.begin(); x.end(); }
void for_all(Container& target, Handler&& func) {
364 suanpan_for_each(target.begin(), target.end(), std::forward<Handler>(func));
367 template<
typename T> std::vector<T>&
append_to(std::vector<T>& a, std::vector<T>&& b) {
368 a.reserve(a.size() + b.size());
369 a.insert(a.end(), std::make_move_iterator(b.begin()), std::make_move_iterator(b.end()));
373 template<
typename T1> [[nodiscard]]
typename enable_if2<is_arma_type<T1>::value,
typename T1::pod_type>::result
inf_norm(
const T1& X) {
return arma::norm(X,
"inf"); }
376#if defined(SUANPAN_CLANG) && !defined(__cpp_lib_ranges)
378namespace std::ranges {
379 template<
class IN,
class OUT,
class FN> OUT
transform(IN& from, OUT to, FN&& func) {
return std::transform(from.begin(), from.end(), to, std::forward<FN>(func)); }
381 template<
class IN,
class FN> FN
for_each(IN& from, FN&& func) {
return std::for_each(from.begin(), from.end(), std::forward<FN>(func)); }
383 template<
class IN,
class FN>
bool any_of(
const IN& from, FN&& func) {
return std::any_of(from.cbegin(), from.cend(), std::forward<FN>(func)); }
385 template<
class IN,
class T>
constexpr auto fill(IN& from, T value) {
return std::fill(from.begin(), from.end(), value); }
387 template<
class IN>
constexpr auto max_element(
const IN& from) {
return std::max_element(from.cbegin(), from.cend()); }
389 template<
class IN>
constexpr auto min_element(
const IN& from) {
return std::min_element(from.cbegin(), from.cend()); }
void object(unique_ptr< T > &new_object, const shared_ptr< DomainBase > &domain, const std::string &id, std::istringstream &command)
Definition ExternalModule.h:79
Definition SparseMatMAGMA.hpp:43
auto any_of(Container &target, Handler &&func)
Definition utility.h:75
void for_all(Container &target, Handler &&func)
Definition suanPan.h:363
void info(const std::string_view format_sv, const T &... args)
Definition suanPan.h:295
std::string pattern(const std::string_view header, const std::string_view file_path, const std::string_view format)
Definition suanPan.h:251
void error(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition suanPan.h:280
void debug(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition suanPan.h:265
std::string format(const std::string_view format_str, const T &... args)
Definition suanPan.h:302
void warning(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition suanPan.h:272
std::vector< T > & append_to(std::vector< T > &a, std::vector< T > &&b)
Definition suanPan.h:367
constexpr T max_element(T start, T end)
Definition utility.h:42
std::mutex print_mutex
Definition suanPan.h:249
void for_each(const IT start, const IT end, F &&FN)
Definition utility.h:31
void fatal(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition suanPan.h:288
enable_if2< is_arma_type< T1 >::value, typenameT1::pod_type >::result inf_norm(const T1 &X)
Definition suanPan.h:373
void highlight(const std::string_view format_sv, const T &... args)
Definition suanPan.h:331
auto allreduce(T &&object)
Definition suanPan.h:240
constexpr auto comm_rank
Definition suanPan.h:235
auto suanpan_assert(F &&handler)
Definition suanPan.h:339
constexpr auto SUANPAN_SUCCESS
Definition suanPan.h:166
auto & SUANPAN_COUT
Definition suanPan.h:185
#define suanpan_for_each
Definition suanPan.h:181
SUANPAN_EXPORT bool SUANPAN_COLOR
Definition suanPan.h:160
#define SUANPAN_EXPORT
Definition suanPan.h:148
constexpr auto SUANPAN_EXIT
Definition suanPan.h:165
constexpr auto comm_size
Definition suanPan.h:236
auto & SUANPAN_CWRN
Definition suanPan.h:186
auto & SUANPAN_CFTL
Definition suanPan.h:188
SUANPAN_EXPORT bool SUANPAN_PRINT
Definition suanPan.h:158
constexpr auto SUANPAN_FAIL
Definition suanPan.h:167
SUANPAN_EXPORT unsigned SUANPAN_ERROR_COUNT
Definition suanPan.h:162
auto reduce(T &&object)
Definition suanPan.h:242
#define SUANPAN_IMPORT
Definition suanPan.h:147
SUANPAN_EXPORT bool SUANPAN_VERBOSE
Definition suanPan.h:159
SUANPAN_EXPORT unsigned SUANPAN_WARNING_COUNT
Definition suanPan.h:161
auto bcast_from_root(T &&object)
Definition suanPan.h:238
auto & SUANPAN_CERR
Definition suanPan.h:187