suanPan
suanPan.h
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright (C) 2017-2022 Theodore Chang
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
16  ******************************************************************************/
17 
18 #ifndef SUANPAN_H
19 #define SUANPAN_H
20 
21 // SUANPAN_DEBUG
22 // _DEBUG --> MSVC
23 // DEBUG --> GCC
24 #if defined(_DEBUG) || defined(DEBUG) || !defined(NDEBUG)
25 #define SUANPAN_DEBUG
26 #define SUANPAN_EXTRA_DEBUG
27 #else
28 #define ARMA_NO_DEBUG
29 #endif
30 
31 #ifdef SUANPAN_SUPERLUMT
32 #define ARMA_DONT_USE_SUPERLU
33 #else
34 #define ARMA_USE_SUPERLU
35 #endif
36 
37 #ifdef SUANPAN_MKL
38 #define MKL_DIRECT_CALL
39 #endif
40 
41 #ifdef SUANPAN_HDF5
42 #define ARMA_USE_HDF5
43 #endif
44 
45 // SUANPAN_WIN
46 // WIN32 _WIN32 __WIN32 __WIN32__ --> MSVC GCC
47 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) || defined(__WIN32__)
48 #ifndef SUANPAN_WIN
49 #define SUANPAN_WIN
50 #endif
51 #endif
52 
53 // SUANPAN_WIN
54 #if defined(WIN64) || defined(_WIN64) || defined(__WIN64) || defined(__WIN64__)
55 #ifndef SUANPAN_WIN
56 #define SUANPAN_WIN
57 #endif
58 #endif
59 
60 #ifdef SUANPAN_WIN
61 #ifndef NOMINMAX
62 #define NOMINMAX
63 #endif
64 #endif
65 
66 // SUANPAN_UNIX
67 #if defined(unix) || defined(__unix__) || defined(__linux__) || defined(linux)
68 #ifndef SUANPAN_UNIX
69 #define SUANPAN_UNIX
70 #endif
71 #endif
72 
73 #ifdef SUANPAN_VERSION
74 #undef SUANPAN_VERSION
75 #endif
76 #ifdef SUANPAN_COMPILER
77 #undef SUANPAN_COMPILER
78 #endif
79 
80 // SUANPAN_VERSION SUANPAN_COMPILER
81 #ifdef __clang__
82 // __clang__ --> clang
83 #ifdef SUANPAN_VERSION
84 #undef SUANPAN_VERSION
85 #endif
86 #define SUANPAN_VERSION __VERSION__
87 #ifdef SUANPAN_COMPILER
88 #undef SUANPAN_COMPILER
89 #endif
90 #define SUANPAN_COMPILER "CLANG"
91 #define SUANPAN_CLANG
92 #elif defined(__GNUG__)
93 // __GNUG__ --> GCC
94 #define SUANPAN_VERSION __VERSION__
95 #define SUANPAN_COMPILER "GCC"
96 #define SUANPAN_GCC
97 #elif defined(_MSC_BUILD)
98 // _MSC_BUILD --> MSVC
99 #define SUANPAN_VERSION _MSC_FULL_VER
100 #define SUANPAN_COMPILER "MSVC"
101 #define SUANPAN_MSVC
102 // cuda unused local function
103 #pragma warning(disable : 4505)
104 #elif defined(__ICC)
105 // __ICC --> Intel C++
106 #define SUANPAN_VERSION __ICC
107 #define SUANPAN_COMPILER "INTEL"
108 #define SUANPAN_INTEL
109 #ifdef SUANPAN_WIN
110 #undef SUANPAN_WIN
111 #endif
112 #ifndef SUANPAN_UNIX
113 #define SUANPAN_UNIX
114 #endif
115 #elif defined(__ICL)
116 // __ICL --> Intel C++
117 #define SUANPAN_VERSION __ICL
118 #define SUANPAN_COMPILER "INTEL"
119 #define SUANPAN_INTEL
120 #ifdef SUANPAN_UNIX
121 #undef SUANPAN_UNIX
122 #endif
123 #ifndef SUANPAN_WIN
124 #define SUANPAN_WIN
125 #endif
126 #endif
127 
128 // _USRDLL --> MSVC
129 #ifdef _USRDLL
130 #ifndef SUANPAN_DLL
131 #define SUANPAN_DLL
132 #endif
133 #endif
134 
135 #ifdef SUANPAN_WIN
136 // WIN MSVC GCC IMPORT
137 #define SUANPAN_IMPORT extern "C" __declspec(dllimport)
138 // WIN MSVC GCC EXPORT
139 #define SUANPAN_EXPORT extern "C" __declspec(dllexport)
140 #elif defined(SUANPAN_UNIX)
141 // UNIX GCC IMPORT
142 #define SUANPAN_IMPORT extern "C"
143 // UNIX GCC EXPORT
144 #define SUANPAN_EXPORT extern "C"
145 #else
146 // EMPTY
147 #define SUANPAN_IMPORT extern "C"
148 #define SUANPAN_EXPORT extern "C"
149 #endif
150 
151 #ifdef SUANPAN_DLL
154 #else
158 #endif
159 
160 constexpr auto SUANPAN_EXIT = 1;
161 constexpr auto SUANPAN_SUCCESS = 0;
162 constexpr auto SUANPAN_FAIL = -1;
163 
164 // TWO IMPLEMENTATIONS
165 #ifndef SUANPAN_WIN
166 #define _strcmpi strcasecmp
167 #endif
168 
169 #ifdef SUANPAN_MT
170 #include <tbb/parallel_sort.h>
171 #include <tbb/parallel_for_each.h>
172 #define suanpan_sort tbb::parallel_sort
173 #define suanpan_for_each tbb::parallel_for_each
174 #else
175 #define suanpan_sort std::sort
176 #define suanpan_for_each std::for_each
177 #endif
178 
179 #include <iostream>
180 inline auto& SUANPAN_COUT = std::cout;
181 inline auto& SUANPAN_CERR = std::cerr;
184 
185 #ifdef SUANPAN_WIN
186 #define FOREGROUND_CYAN (FOREGROUND_BLUE | FOREGROUND_GREEN)
187 #define FOREGROUND_YELLOW (FOREGROUND_RED | FOREGROUND_GREEN)
188 #else
189 #define FOREGROUND_RED "\033[1;31m"
190 #define FOREGROUND_GREEN "\033[1;32m"
191 #define FOREGROUND_YELLOW "\033[1;33m"
192 #define FOREGROUND_BLUE "\033[1;34m"
193 #define FOREGROUND_CYAN "\033[1;36m"
194 #endif
195 
196 #include <Toolbox/print.h>
197 
198 #define ARMA_COUT_STREAM SUANPAN_SYNC_COUT
199 #define ARMA_CERR_STREAM SUANPAN_SYNC_CERR
200 
201 #include <armadillo/armadillo>
202 
203 using namespace arma;
204 
205 #include <filesystem>
206 
207 namespace fs = std::filesystem;
208 
209 #include <memory>
210 
211 using std::shared_ptr;
212 using std::unique_ptr;
213 using std::weak_ptr;
214 
215 using std::make_shared;
216 using std::make_unique;
217 
218 using std::exception;
219 using std::invalid_argument;
220 using std::logic_error;
221 using std::out_of_range;
222 
223 using std::istringstream;
224 using std::ostringstream;
225 using std::string;
226 
227 template<class T> concept sp_d = std::is_floating_point_v<T>;
228 template<class T> concept sp_i = std::is_integral_v<T>;
229 
230 namespace suanpan {
231  template<class IN, class FN> void for_all(IN& from, FN&& func) {
232  suanpan_for_each(from.begin(), from.end(), std::forward<FN>(func));
233  }
234 }
235 
236 #if defined(SUANPAN_CLANG) && !defined(__cpp_lib_ranges)
237 // as of clang 13, ranges support is not complete
238 namespace std::ranges {
239  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)); }
240 
241  template<class IN, class FN> FN for_each(IN& from, FN&& func) { return std::for_each(from.begin(), from.end(), std::forward<FN>(func)); }
242 
243  template<class IN, class OUT> OUT copy(IN& from, OUT to) { return std::copy(from.begin(), from.end(), to); }
244 }
245 #endif
246 
247 #endif
Definition: MatrixModifier.hpp:36
void for_all(IN &from, FN &&func)
Definition: suanPan.h:231
Definition: tensorToolbox.h:93
concept sp_d
Definition: suanPan.h:227
constexpr auto SUANPAN_SUCCESS
Definition: suanPan.h:161
auto & SUANPAN_COUT
Definition: suanPan.h:180
#define suanpan_for_each
Definition: suanPan.h:176
#define SUANPAN_EXPORT
Definition: suanPan.h:148
constexpr auto SUANPAN_EXIT
Definition: suanPan.h:160
SUANPAN_EXPORT bool SUANPAN_PRINT
Definition: suanPan.h:155
constexpr auto SUANPAN_FAIL
Definition: suanPan.h:162
#define SUANPAN_IMPORT
Definition: suanPan.h:147
SUANPAN_EXPORT const char * SUANPAN_EXE
Definition: suanPan.h:157
SUANPAN_EXPORT bool SUANPAN_VERBOSE
Definition: suanPan.h:156
auto & SUANPAN_SYNC_COUT
Definition: suanPan.h:182
concept sp_i
Definition: suanPan.h:228
auto & SUANPAN_SYNC_CERR
Definition: suanPan.h:183
auto & SUANPAN_CERR
Definition: suanPan.h:181