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
53#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) || defined(__WIN32__)
60#if defined(WIN64) || defined(_WIN64) || defined(__WIN64) || defined(__WIN64__)
73#if defined(unix) || defined(__unix__) || defined(__linux__) || defined(linux)
82#ifdef SUANPAN_COMPILER
83#undef SUANPAN_COMPILER
92#define SUANPAN_VERSION __VERSION__
93#ifdef SUANPAN_COMPILER
94#undef SUANPAN_COMPILER
96#define SUANPAN_COMPILER "CLANG"
98#elif defined(__GNUG__)
100#define SUANPAN_VERSION __VERSION__
101#define SUANPAN_COMPILER "GCC"
103#elif defined(_MSC_BUILD)
105#define SUANPAN_VERSION _MSC_FULL_VER
106#define SUANPAN_COMPILER "MSVC"
109#pragma warning(disable : 4505)
112#define SUANPAN_VERSION __ICC
113#define SUANPAN_COMPILER "INTEL"
123#define SUANPAN_VERSION __ICL
124#define SUANPAN_COMPILER "INTEL"
143#define SUANPAN_IMPORT extern "C" __declspec(dllimport)
145#define SUANPAN_EXPORT extern "C" __declspec(dllexport)
146#elif defined(SUANPAN_UNIX)
148#define SUANPAN_IMPORT extern "C"
150#define SUANPAN_EXPORT extern "C"
153#define SUANPAN_IMPORT extern "C"
154#define SUANPAN_EXPORT extern "C"
177#define _strcmpi strcasecmp
181#include <oneapi/tbb/parallel_for_each.h>
182#include <oneapi/tbb/parallel_sort.h>
183#define suanpan_sort tbb::parallel_sort
184#define suanpan_for_each tbb::parallel_for_each
186#define suanpan_sort std::sort
187#define suanpan_for_each std::for_each
196#define ARMA_COUT_STREAM SUANPAN_COUT
197#define ARMA_CERR_STREAM SUANPAN_COUT
199#include <armadillo/armadillo>
203namespace fs = std::filesystem;
205#include <fmt/color.h>
211 inline std::string
pattern(
const std::string_view header,
const std::string_view file_name,
const std::string_view
format) {
213 pattern += fs::path(file_name).filename().string();
219 template<
typename...
T>
void debug(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
223 else SUANPAN_COUT << fmt::vformat(
pattern(
"[DEBUG] ", file_name, format_str), fmt::make_format_args(line, args...));
226 template<
typename...
T>
void warning(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
230 if(
SUANPAN_COLOR)
SUANPAN_CWRN << fmt::vformat(fg(fmt::color::slate_blue),
pattern(
"[WARNING] ", file_name, format_str), fmt::make_format_args(line, args...));
231 else SUANPAN_CWRN << fmt::vformat(
pattern(
"[WARNING] ", file_name, format_str), fmt::make_format_args(line, args...));
234 template<
typename...
T>
void error(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
239 else SUANPAN_CERR << fmt::vformat(
pattern(
"[ERROR] ", file_name, format_str), fmt::make_format_args(line, args...));
242 template<
typename...
T>
void fatal(
const std::string_view file_name,
const int line,
const std::string_view format_str,
const T&... args) {
246 else SUANPAN_CFTL << fmt::vformat(
pattern(
"[FATAL] ", file_name, format_str), fmt::make_format_args(line, args...));
249 template<
typename...
T>
void info(
const std::string_view format_str,
const T&... args) {
252 if(
SUANPAN_COLOR)
SUANPAN_COUT << fmt::vformat(fg(fmt::color::green_yellow), format_str, fmt::make_format_args(args...));
253 else SUANPAN_COUT << fmt::vformat(format_str, fmt::make_format_args(args...));
256 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...)); }
258 template<
typename T> std::string
format(
const Col<T>& in_vec) {
260 if(std::is_floating_point_v<T>)
for(
const auto I : in_vec) output +=
format(
" {: 1.4e}", I);
261 else for(
const auto I : in_vec) output +=
format(
" {:6d}", I);
266 template<
typename T>
void info(
const Col<T>& in_vec) {
273 template<
typename T>
void info(
const std::string_view format_str,
const Col<T>& in_vec) {
275 std::string output =
format(format_str);
276 if(format_str.back() !=
'\t' && format_str.back() !=
'\n') output +=
'\n';
283 template<
typename...
T>
void highlight(
const std::string_view format_str,
const T&... args) {
287 else SUANPAN_COUT << fmt::vformat(format_str, fmt::make_format_args(args...));
292#pragma warning(disable : 4100)
302#pragma warning(default : 4100)
305#define suanpan_info suanpan::info
306#define suanpan_highlight suanpan::highlight
307#define suanpan_debug(...) suanpan::debug(__FILE__, __LINE__, ##__VA_ARGS__)
308#define suanpan_warning(...) suanpan::warning(__FILE__, __LINE__, ##__VA_ARGS__)
309#define suanpan_error(...) suanpan::error(__FILE__, __LINE__, ##__VA_ARGS__)
310#define suanpan_fatal(...) suanpan::fatal(__FILE__, __LINE__, ##__VA_ARGS__)
314using std::shared_ptr;
315using std::unique_ptr;
318using std::make_shared;
319using std::make_unique;
322using std::invalid_argument;
323using std::logic_error;
324using std::out_of_range;
326using std::istringstream;
327using std::ostringstream;
330template<
class T>
concept sp_d = std::is_floating_point_v<T>;
331template<
class T>
concept sp_i = std::is_integral_v<T>;
334 template<
class IN,
class FN>
requires requires(IN& x) { x.begin(); x.end(); }
340#if defined(SUANPAN_CLANG) && !defined(__cpp_lib_ranges)
342namespace std::ranges {
343 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)); }
345 template<
class IN,
class FN> FN
for_each(IN& from, FN&& func) {
return std::for_each(from.begin(), from.end(), std::forward<FN>(func)); }
347 template<
class IN,
class OUT> OUT copy(IN& from, OUT to) {
return std::copy(from.begin(), from.end(), to); }
351template<
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"); }
Definition: suanPan.h:330
Definition: suanPan.h:331
Definition: MatrixModifier.hpp:36
void error(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition: suanPan.h:234
void debug(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition: suanPan.h:219
std::string format(const std::string_view format_str, const T &... args)
Definition: suanPan.h:256
void info(const std::string_view format_str, const T &... args)
Definition: suanPan.h:249
void warning(const std::string_view file_name, const int line, const std::string_view format_str, const T &... args)
Definition: suanPan.h:226
void for_all(IN &from, FN &&func)
Definition: suanPan.h:335
void highlight(const std::string_view format_str, const T &... args)
Definition: suanPan.h:283
std::mutex print_mutex
Definition: suanPan.h:209
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:242
std::string pattern(const std::string_view header, const std::string_view file_name, const std::string_view format)
Definition: suanPan.h:211
std::string format(const Col< T > &in_vec)
Definition: suanPan.h:258
double norm(const vec &)
Definition: tensor.cpp:370
constexpr auto SUANPAN_SUCCESS
Definition: suanPan.h:172
auto & SUANPAN_COUT
Definition: suanPan.h:191
#define suanpan_for_each
Definition: suanPan.h:187
SUANPAN_EXPORT bool SUANPAN_COLOR
Definition: suanPan.h:166
#define SUANPAN_EXPORT
Definition: suanPan.h:154
constexpr auto SUANPAN_EXIT
Definition: suanPan.h:171
auto & SUANPAN_CWRN
Definition: suanPan.h:192
auto & SUANPAN_CFTL
Definition: suanPan.h:194
void suanpan_assert(const std::function< void()> &F)
Definition: suanPan.h:296
SUANPAN_EXPORT bool SUANPAN_PRINT
Definition: suanPan.h:164
constexpr auto SUANPAN_FAIL
Definition: suanPan.h:173
SUANPAN_EXPORT unsigned SUANPAN_ERROR_COUNT
Definition: suanPan.h:168
enable_if2< is_arma_type< T1 >::value, typenameT1::pod_type >::result inf_norm(const T1 &X)
Definition: suanPan.h:351
#define SUANPAN_IMPORT
Definition: suanPan.h:153
SUANPAN_EXPORT bool SUANPAN_VERBOSE
Definition: suanPan.h:165
SUANPAN_EXPORT unsigned SUANPAN_WARNING_COUNT
Definition: suanPan.h:167
auto & SUANPAN_CERR
Definition: suanPan.h:193