24#if defined(_DEBUG) || defined(DEBUG) || !defined(NDEBUG)
26#define SUANPAN_EXTRA_DEBUG
31#ifdef SUANPAN_SUPERLUMT
32#define ARMA_DONT_USE_SUPERLU
34#define ARMA_USE_SUPERLU
38#define MKL_DIRECT_CALL
45#ifdef SUANSPAN_64BIT_INT
46#define ARMA_BLAS_64BIT_INT
57#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) || defined(__WIN32__)
64#if defined(WIN64) || defined(_WIN64) || defined(__WIN64) || defined(__WIN64__)
77#if defined(unix) || defined(__unix__) || defined(__linux__) || defined(linux)
86#ifdef SUANPAN_COMPILER
87#undef SUANPAN_COMPILER
96#define SUANPAN_VERSION __VERSION__
97#ifdef SUANPAN_COMPILER
98#undef SUANPAN_COMPILER
100#define SUANPAN_COMPILER "CLANG"
102#elif defined(__GNUG__)
104#define SUANPAN_VERSION __VERSION__
105#define SUANPAN_COMPILER "GCC"
107#elif defined(_MSC_BUILD)
109#define SUANPAN_VERSION _MSC_FULL_VER
110#define SUANPAN_COMPILER "MSVC"
113#pragma warning(disable : 4068)
115#pragma warning(disable : 4505)
117#pragma warning(disable : 4127)
120#define SUANPAN_VERSION __ICC
121#define SUANPAN_COMPILER "INTEL"
131#define SUANPAN_VERSION __ICL
132#define SUANPAN_COMPILER "INTEL"
151#define SUANPAN_IMPORT extern "C" __declspec(dllimport)
153#define SUANPAN_EXPORT extern "C" __declspec(dllexport)
154#elif defined(SUANPAN_UNIX)
156#define SUANPAN_IMPORT extern "C"
158#define SUANPAN_EXPORT extern "C"
161#define SUANPAN_IMPORT extern "C"
162#define SUANPAN_EXPORT extern "C"
185#define _strcmpi strcasecmp
189#include <oneapi/tbb/parallel_for_each.h>
190#include <oneapi/tbb/parallel_sort.h>
191#define suanpan_sort tbb::parallel_sort
192#define suanpan_for_each tbb::parallel_for_each
194#define suanpan_sort std::sort
195#define suanpan_for_each std::for_each
204#define ARMA_COUT_STREAM SUANPAN_COUT
205#define ARMA_CERR_STREAM SUANPAN_COUT
207#include <armadillo/armadillo>
209#include <armadillo/ext_def_lapack.hpp>
213namespace fs = std::filesystem;
215#ifdef SUANPAN_DISTRIBUTED
216#include <mpl/mpl.hpp>
218inline auto& comm_world{mpl::environment::comm_world()};
219inline const auto comm_rank{comm_world.rank()};
220inline const auto comm_size{comm_world.size()};
222template<
typename T>
concept mpl_floating_t = std::is_same_v<T, float> || std::is_same_v<T, double>;
223template<
typename T>
concept mpl_complex_t = std::is_same_v<T, std::complex<typename T::value_type>> && mpl_floating_t<typename T::value_type>;
224template<
typename T>
concept mpl_data_t = mpl_floating_t<T> || mpl_complex_t<T>;
226template<
typename T>
requires std::is_arithmetic_v<T>
auto bcast_from_root(
T object) {
227 comm_world.bcast(0,
object);
232 comm_world.bcast(0,
const_cast<T*
>(
object.memptr()), mpl::contiguous_layout<T>{
object.n_elem});
236template<
typename T>
requires std::is_arithmetic_v<T>
auto allreduce(
T object) {
237 comm_world.allreduce(mpl::plus<T>(),
object);
241template<mpl_data_t T>
auto&
allreduce(
const Mat<T>&
object) {
242 comm_world.allreduce(mpl::plus<T>(),
const_cast<T*
>(
object.memptr()), mpl::contiguous_layout<T>{
object.n_elem});
246template<mpl_data_t T>
auto&
reduce(
const Mat<T>&
object) {
247 comm_world.reduce(mpl::plus<T>(), 0,
const_cast<T*
>(
object.memptr()), mpl::contiguous_layout<T>{
object.n_elem});
256template<
typename T>
auto allreduce(
T&&
object) {
return std::forward<T>(
object); }
258template<
typename T>
auto reduce(
T&&
object) {
return std::forward<T>(
object); }
261#include <fmt/color.h>
267 inline std::string
pattern(
const std::string_view header,
const std::string_view file_name,
const std::string_view
format) {
278 pattern += fs::path(file_name).filename().string();
284 template<
typename...
T>
void debug(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
288 else SUANPAN_COUT << fmt::vformat(
pattern(
"[DEBUG] ", file_name, format_str), fmt::make_format_args(line, args...));
291 template<
typename...
T>
void warning(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
295 if(
SUANPAN_COLOR)
SUANPAN_CWRN << fmt::vformat(fg(fmt::color::slate_blue),
pattern(
"[WARNING] ", file_name, format_str), fmt::make_format_args(line, args...));
296 else SUANPAN_CWRN << fmt::vformat(
pattern(
"[WARNING] ", file_name, format_str), fmt::make_format_args(line, args...));
299 template<
typename...
T>
void error(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
304 else SUANPAN_CERR << fmt::vformat(
pattern(
"[ERROR] ", file_name, format_str), fmt::make_format_args(line, args...));
307 template<
typename...
T>
void fatal(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
311 else SUANPAN_CFTL << fmt::vformat(
pattern(
"[FATAL] ", file_name, format_str), fmt::make_format_args(line, args...));
314 template<
typename...
T>
void info(
const std::string_view format_sv,
const T&... args) {
318 else SUANPAN_COUT << fmt::vformat(format_sv, fmt::make_format_args(args...));
321 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...)); }
323 template<
typename T> std::string
format(
const Col<T>& in_vec) {
325 if(std::is_floating_point_v<T>)
326 for(
const auto I : in_vec) output +=
format(
" {: 1.4e}", I);
328 for(
const auto I : in_vec) output +=
format(
" {:6d}", I);
333 template<
typename T>
void info(
const Col<T>& in_vec) {
340 template<
typename T>
void info(
const std::string_view format_sv,
const Col<T>& in_vec) {
342 std::string output{
format(format_sv)};
343 if(format_sv.back() !=
'\t' && format_sv.back() !=
'\n') output +=
'\n';
350 template<
typename...
T>
void highlight(
const std::string_view format_sv,
const T&... args) {
354 else SUANPAN_COUT << fmt::vformat(format_sv, fmt::make_format_args(args...));
359#pragma warning(disable : 4100)
369#pragma warning(default : 4100)
372#define suanpan_info suanpan::info
373#define suanpan_highlight suanpan::highlight
374#define suanpan_debug(...) suanpan::debug(__FILE__, __LINE__, ##__VA_ARGS__)
375#define suanpan_warning(...) suanpan::warning(__FILE__, __LINE__, ##__VA_ARGS__)
376#define suanpan_error(...) suanpan::error(__FILE__, __LINE__, ##__VA_ARGS__)
377#define suanpan_fatal(...) suanpan::fatal(__FILE__, __LINE__, ##__VA_ARGS__)
381using std::shared_ptr;
382using std::unique_ptr;
384template<
class T>
concept sp_d = std::is_same_v<T, float> || std::is_same_v<T, double>;
385template<
class T>
concept sp_i = std::is_integral_v<T>;
387template<
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>>);
390 template<
class IN,
class FN>
requires requires(IN& x) { x.begin(); x.end(); }
void for_all(IN& from, FN&& func) {
395#if defined(SUANPAN_CLANG) && !defined(__cpp_lib_ranges)
397namespace std::ranges {
398 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)); }
400 template<
class IN,
class FN> FN
for_each(IN& from, FN&& func) {
return std::for_each(from.begin(), from.end(), std::forward<FN>(func)); }
402 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)); }
404 template<
class IN,
class OUT> OUT copy(IN& from, OUT to) {
return std::copy(from.begin(), from.end(), to); }
408template<
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"); }
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
void info(const std::string_view format_sv, const T &... args)
Definition suanPan.h:314
void error(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition suanPan.h:299
void debug(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition suanPan.h:284
std::string format(const std::string_view format_str, const T &... args)
Definition suanPan.h:321
void warning(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition suanPan.h:291
void for_all(IN &from, FN &&func)
Definition suanPan.h:390
std::mutex print_mutex
Definition suanPan.h:265
void for_each(const IT start, const IT end, F &&FN)
Definition utility.h:28
void fatal(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition suanPan.h:307
std::string pattern(const std::string_view header, const std::string_view file_name, const std::string_view format)
Definition suanPan.h:267
void highlight(const std::string_view format_sv, const T &... args)
Definition suanPan.h:350
auto allreduce(T &&object)
Definition suanPan.h:256
constexpr auto comm_rank
Definition suanPan.h:251
constexpr auto SUANPAN_SUCCESS
Definition suanPan.h:180
auto & SUANPAN_COUT
Definition suanPan.h:199
#define suanpan_for_each
Definition suanPan.h:195
SUANPAN_EXPORT bool SUANPAN_COLOR
Definition suanPan.h:174
#define SUANPAN_EXPORT
Definition suanPan.h:162
constexpr auto SUANPAN_EXIT
Definition suanPan.h:179
constexpr auto comm_size
Definition suanPan.h:252
auto & SUANPAN_CWRN
Definition suanPan.h:200
auto & SUANPAN_CFTL
Definition suanPan.h:202
void suanpan_assert(const std::function< void()> &F)
Definition suanPan.h:363
SUANPAN_EXPORT bool SUANPAN_PRINT
Definition suanPan.h:172
constexpr auto SUANPAN_FAIL
Definition suanPan.h:181
SUANPAN_EXPORT unsigned SUANPAN_ERROR_COUNT
Definition suanPan.h:176
enable_if2< is_arma_type< T1 >::value, typenameT1::pod_type >::result inf_norm(const T1 &X)
Definition suanPan.h:408
auto reduce(T &&object)
Definition suanPan.h:258
#define SUANPAN_IMPORT
Definition suanPan.h:161
SUANPAN_EXPORT bool SUANPAN_VERBOSE
Definition suanPan.h:173
SUANPAN_EXPORT unsigned SUANPAN_WARNING_COUNT
Definition suanPan.h:175
auto bcast_from_root(T &&object)
Definition suanPan.h:254
auto & SUANPAN_CERR
Definition suanPan.h:201