1 #ifndef CPPAD_CG_MODEL_LIBRARY_C_SOURCE_GEN_IMPL_INCLUDED 2 #define CPPAD_CG_MODEL_LIBRARY_C_SOURCE_GEN_IMPL_INCLUDED 24 const unsigned long ModelLibraryCSourceGen<Base>::API_VERSION = 7;
27 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_VERSION =
"cppad_cg_version";
30 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_MODELS =
"cppad_cg_models";
33 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_ONCLOSE =
"cppad_cg_on_close";
36 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_SETTHREADPOOLDISABLED =
"cppad_cg_set_thread_pool_disabled";
39 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_ISTHREADPOOLDISABLED =
"cppad_cg_is_thread_pool_disabled";
42 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_SETTHREADS =
"cppad_cg_set_thread_number";
45 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_GETTHREADS =
"cppad_cg_get_thread_number";
48 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_SETTHREADSCHEDULERSTRAT =
"cppad_cg_thpool_set_scheduler_strategy";
51 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_GETTHREADSCHEDULERSTRAT =
"cppad_cg_thpool_get_scheduler_strategy";
54 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_SETTHREADPOOLVERBOSE =
"cppad_cg_thpool_set_verbose";
57 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_ISTHREADPOOLVERBOSE =
"cppad_cg_thpool_is_verbose";
60 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_SETTHREADPOOLGUIDEDMAXGROUPWORK =
"cppad_cg_thpool_set_guided_maxgroupwork";
63 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_GETTHREADPOOLGUIDEDMAXGROUPWORK =
"cppad_cg_thpool_get_guided_maxgroupwork";
66 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_SETTHREADPOOLNUMBEROFTIMEMEAS =
"cppad_cg_thpool_set_number_of_time_meas";
69 const std::string ModelLibraryCSourceGen<Base>::FUNCTION_GETTHREADPOOLNUMBEROFTIMEMEAS =
"cppad_cg_thpool_get_number_of_time_meas";
72 const std::string ModelLibraryCSourceGen<Base>::CONST =
"const";
81 for (
const auto& it : _models) {
82 saveSources(sourcesFolder, it.second->getSources());
86 saveSources(sourcesFolder, getLibrarySources());
89 saveSources(sourcesFolder, getCustomSources());
94 const std::map<std::string, std::string>& sources) {
95 for (
const auto& it : sources) {
97 std::ofstream sourceFile;
99 sourceFile.open(file.c_str());
100 sourceFile << it.second;
107 if (_libSources.empty()) {
108 generateVersionSource(_libSources);
109 generateModelsSource(_libSources);
110 generateOnCloseSource(_libSources);
111 generateThreadPoolSources(_libSources);
113 if(_multiThreading != MultiThreadingType::NONE) {
114 bool usingMultiThreading =
false;
115 for (
const auto& it : _models) {
116 if (it.second->isJacobianMultiThreadingEnabled() || it.second->isHessianMultiThreadingEnabled()) {
117 usingMultiThreading =
true;
122 if (usingMultiThreading) {
123 if (_multiThreading == MultiThreadingType::PTHREADS) {
124 _libSources[
"thread_pool.c"] = CPPADCG_PTHREAD_POOL_C_FILE;
126 }
else if (_multiThreading == MultiThreadingType::OPENMP) {
127 _libSources[
"thread_pool.c"] = CPPADCG_OPENMP_C_FILE;
139 _cache <<
"unsigned long " << FUNCTION_VERSION <<
"() {\n" 140 <<
" return " << API_VERSION <<
"u;\n" 143 sources[FUNCTION_VERSION +
".c"] = _cache.str();
152 " static const char* const models[] = {\n";
154 for (
auto it = _models.begin(); it != _models.end(); ++it) {
155 if (it != _models.begin()) {
158 _cache <<
" \"" << it->first <<
"\"";
161 " *names = models;\n" 162 " *count = " << _models.size() <<
";\n" 165 sources[FUNCTION_MODELS +
".c"] = _cache.str();
170 bool pthreads =
false;
171 if(_multiThreading == MultiThreadingType::PTHREADS) {
172 for (
const auto& it : _models) {
173 if (it.second->isJacobianMultiThreadingEnabled() || it.second->isHessianMultiThreadingEnabled()) {
182 _cache << CPPADCG_PTHREAD_POOL_H_FILE <<
"\n\n";
184 _cache <<
"void " << FUNCTION_ONCLOSE <<
"() {\n";
186 _cache <<
"cppadcg_thpool_shutdown();\n";
190 sources[FUNCTION_ONCLOSE +
".c"] = _cache.str();
196 bool usingMultiThreading =
false;
197 if(_multiThreading != MultiThreadingType::NONE) {
198 for (
const auto& it : _models) {
199 if (it.second->isJacobianMultiThreadingEnabled() || it.second->isHessianMultiThreadingEnabled()) {
200 usingMultiThreading =
true;
206 if (usingMultiThreading && _multiThreading == MultiThreadingType::PTHREADS) {
208 _cache << CPPADCG_PTHREAD_POOL_H_FILE <<
"\n\n";
210 _cache <<
"void " << FUNCTION_SETTHREADPOOLDISABLED <<
"(int disabled) {\n";
211 _cache <<
" cppadcg_thpool_set_disabled(disabled);\n";
214 _cache <<
"int " << FUNCTION_ISTHREADPOOLDISABLED <<
"() {\n";
215 _cache <<
" return cppadcg_thpool_is_disabled();\n";
218 _cache <<
"void " << FUNCTION_SETTHREADS <<
"(unsigned int n) {\n";
219 _cache <<
" cppadcg_thpool_set_threads(n);\n";
222 _cache <<
"unsigned int " << FUNCTION_GETTHREADS <<
"() {\n";
223 _cache <<
" return cppadcg_thpool_get_threads();\n";
226 _cache <<
"void " << FUNCTION_SETTHREADSCHEDULERSTRAT <<
"(enum ScheduleStrategy s) {\n";
227 _cache <<
" cppadcg_thpool_set_scheduler_strategy(s);\n";
230 _cache <<
"enum ScheduleStrategy " << FUNCTION_GETTHREADSCHEDULERSTRAT <<
"() {\n";
231 _cache <<
" return cppadcg_thpool_get_scheduler_strategy();\n";
234 _cache <<
"void " << FUNCTION_SETTHREADPOOLVERBOSE <<
"(int v) {\n";
235 _cache <<
" cppadcg_thpool_set_verbose(v);\n";
238 _cache <<
"int " << FUNCTION_ISTHREADPOOLVERBOSE <<
"() {\n";
239 _cache <<
" return cppadcg_thpool_is_verbose();\n";
242 _cache <<
"void " << FUNCTION_SETTHREADPOOLGUIDEDMAXGROUPWORK <<
"(float v) {\n";
243 _cache <<
" cppadcg_thpool_set_guided_maxgroupwork(v);\n";
246 _cache <<
"float " << FUNCTION_GETTHREADPOOLGUIDEDMAXGROUPWORK <<
"() {\n";
247 _cache <<
" return cppadcg_thpool_get_guided_maxgroupwork();\n";
250 _cache <<
"void " << FUNCTION_SETTHREADPOOLNUMBEROFTIMEMEAS <<
"(unsigned int n) {\n";
251 _cache <<
" cppadcg_thpool_set_n_time_meas(n);\n";
254 _cache <<
"unsigned int " << FUNCTION_GETTHREADPOOLNUMBEROFTIMEMEAS <<
"() {\n";
255 _cache <<
" return cppadcg_thpool_get_n_time_meas();\n";
258 sources[
"thread_pool_access.c"] = _cache.str();
260 }
else if(usingMultiThreading && _multiThreading == MultiThreadingType::OPENMP) {
262 _cache <<
"#include <omp.h>\n";
263 _cache << CPPADCG_OPENMP_H_FILE <<
"\n\n";
265 _cache <<
"void " << FUNCTION_SETTHREADPOOLDISABLED <<
"(int disabled) {\n";
266 _cache <<
" cppadcg_openmp_set_disabled(disabled);\n";
269 _cache <<
"int " << FUNCTION_ISTHREADPOOLDISABLED <<
"() {\n";
270 _cache <<
" return cppadcg_openmp_is_disabled();\n";
273 _cache <<
"void " << FUNCTION_SETTHREADS <<
"(unsigned int n) {\n";
274 _cache <<
" cppadcg_openmp_set_threads(n);\n";
277 _cache <<
"unsigned int " << FUNCTION_GETTHREADS <<
"() {\n";
278 _cache <<
" return cppadcg_openmp_get_threads();\n";
281 _cache <<
"void " << FUNCTION_SETTHREADSCHEDULERSTRAT <<
"(enum ScheduleStrategy s) {\n";
282 _cache <<
" cppadcg_openmp_set_scheduler_strategy(s);\n";
285 _cache <<
"enum ScheduleStrategy " << FUNCTION_GETTHREADSCHEDULERSTRAT <<
"() {\n";
286 _cache <<
" return cppadcg_openmp_get_scheduler_strategy();\n";
289 _cache <<
"void " << FUNCTION_SETTHREADPOOLVERBOSE <<
"(int v) {\n";
290 _cache <<
" cppadcg_openmp_set_verbose(v);\n";
293 _cache <<
"int " << FUNCTION_ISTHREADPOOLVERBOSE <<
"() {\n";
294 _cache <<
" return cppadcg_openmp_is_verbose();\n";
297 _cache <<
"void " << FUNCTION_SETTHREADPOOLGUIDEDMAXGROUPWORK <<
"(float v) {\n";
300 _cache <<
"float " << FUNCTION_GETTHREADPOOLGUIDEDMAXGROUPWORK <<
"() {\n";
301 _cache <<
" return 1.0;\n";
304 _cache <<
"void " << FUNCTION_SETTHREADPOOLNUMBEROFTIMEMEAS <<
"(unsigned int n) {\n";
307 _cache <<
"unsigned int " << FUNCTION_GETTHREADPOOLNUMBEROFTIMEMEAS <<
"() {\n";
308 _cache <<
" return 0;\n";
311 sources[
"thread_pool_access.c"] = _cache.str();
315 _cache <<
"enum ScheduleStrategy {SCHED_STATIC = 1, SCHED_DYNAMIC = 2, SCHED_GUIDED = 3};\n" 317 _cache <<
"void " << FUNCTION_SETTHREADPOOLDISABLED <<
"(int disabled) {\n";
320 _cache <<
"int " << FUNCTION_ISTHREADPOOLDISABLED <<
"() {\n";
321 _cache <<
" return 1;\n";
324 _cache <<
"void " << FUNCTION_SETTHREADS <<
"(unsigned int n) {\n";
327 _cache <<
"unsigned int " << FUNCTION_GETTHREADS <<
"() {\n";
328 _cache <<
" return 1;\n";
331 _cache <<
"void " << FUNCTION_SETTHREADSCHEDULERSTRAT <<
"(enum ScheduleStrategy s) {\n";
334 _cache <<
"enum ScheduleStrategy " << FUNCTION_GETTHREADSCHEDULERSTRAT <<
"() {\n";
335 _cache <<
" return SCHED_STATIC;\n";
338 _cache <<
"void " << FUNCTION_SETTHREADPOOLVERBOSE <<
"(int v) {\n";
341 _cache <<
"int " << FUNCTION_ISTHREADPOOLVERBOSE <<
"() {\n";
342 _cache <<
" return 0;\n";
345 _cache <<
"void " << FUNCTION_SETTHREADPOOLGUIDEDMAXGROUPWORK <<
"(float v) {\n";
348 _cache <<
"float " << FUNCTION_GETTHREADPOOLGUIDEDMAXGROUPWORK <<
"() {\n";
349 _cache <<
" return 1.0;\n";
352 _cache <<
"void " << FUNCTION_SETTHREADPOOLNUMBEROFTIMEMEAS <<
"(unsigned int n) {\n";
355 _cache <<
"unsigned int " << FUNCTION_GETTHREADPOOLNUMBEROFTIMEMEAS <<
"() {\n";
356 _cache <<
" return 0;\n";
359 sources[
"thread_pool_access.c"] = _cache.str();
virtual const std::map< std::string, std::string > & getLibrarySources()
void saveSources(const std::string &sourcesFolder)
std::string createPath(const std::string &baseFolder, const std::string &file)
static void printFunctionDeclaration(std::ostringstream &out, const std::string &returnType, const std::string &functionName, const std::vector< std::string > &arguments, const std::vector< std::string > &arguments2={})
void createFolder(const std::string &folder)