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)
79 #ifdef SUANPAN_VERSION
80 #undef SUANPAN_VERSION
82 #ifdef SUANPAN_COMPILER
83 #undef SUANPAN_COMPILER
89 #ifdef SUANPAN_VERSION
90 #undef SUANPAN_VERSION
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"
114 #define SUANPAN_INTEL
123 #define SUANPAN_VERSION __ICL
124 #define SUANPAN_COMPILER "INTEL"
125 #define SUANPAN_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>
200 using namespace arma;
202 #include <filesystem>
203 namespace 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)
294 #include <functional>
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__)
314 using std::shared_ptr;
315 using std::unique_ptr;
318 using std::make_shared;
319 using std::make_unique;
321 using std::exception;
322 using std::invalid_argument;
323 using std::logic_error;
324 using std::out_of_range;
326 using std::istringstream;
327 using std::ostringstream;
330 template<
class T> concept
sp_d = std::is_floating_point_v<T>;
331 template<
class T> concept
sp_i = std::is_integral_v<T>;
334 template<
class IN,
class FN>
void for_all(IN& from, FN&& func) {
339 #if defined(SUANPAN_CLANG) && !defined(__cpp_lib_ranges)
341 namespace std::ranges {
342 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)); }
344 template<
class IN,
class FN> FN for_each(IN& from, FN&& func) {
return std::for_each(from.begin(), from.end(), std::forward<FN>(func)); }
346 template<
class IN,
class OUT> OUT copy(IN& from, OUT to) {
return std::copy(from.begin(), from.end(), to); }
350 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"); }
Definition: MatrixModifier.hpp:36
std::string pattern(const std::string_view header, const std::string_view &file_name, const std::string_view &format)
Definition: suanPan.h:211
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
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 info(const std::string_view format_str, const Col< T > &in_vec)
Definition: suanPan.h:273
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_all(IN &from, FN &&func)
Definition: suanPan.h:334
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 format(const Col< T > &in_vec)
Definition: suanPan.h:258
double norm(const vec &)
Definition: tensor.cpp:370
concept sp_d
Definition: suanPan.h:330
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
enable_if2< is_arma_type< T1 >::value, typename T1::pod_type >::result inf_norm(const T1 &X)
Definition: suanPan.h:350
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
#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
concept sp_i
Definition: suanPan.h:331
auto & SUANPAN_CERR
Definition: suanPan.h:193