CppADCodeGen  2.4.3
A C++ Algorithmic Differentiation Package with Source Code Generation
cppadcg.hpp
1 #ifndef CPPADCG_INCLUDED
2 #define CPPADCG_INCLUDED
3 /* --------------------------------------------------------------------------
4  * CppADCodeGen: C++ Algorithmic Differentiation with Source Code Generation:
5  * Copyright (C) 2012 Ciengis
6  * Copyright (C) 2019 Joao Leal
7  *
8  * CppADCodeGen is distributed under multiple licenses:
9  *
10  * - Eclipse Public License Version 1.0 (EPL1), and
11  * - GNU General Public License Version 3 (GPL3).
12  *
13  * EPL1 terms and conditions can be found in the file "epl-v10.txt", while
14  * terms and conditions for the GPL3 can be found in the file "gpl3.txt".
15  * ----------------------------------------------------------------------------
16  * Author: Joao Leal
17  */
18 
19 // --------------------------------------------------------------------------
20 
21 // Make sure CppADCodeGen is included before CppAD
22 # ifdef CPPAD_CPPAD_HPP
23 static_assert(false,
24 "\ncppad/cppad.hpp was included before cppad/cg/cppadcg.hpp\n"
25 "cppadcg.hpp includes cppad.hpp with the proper environment for CppADCodeGen"
26 );
27 # endif
28 
29 // System routines that can be used by rest of CppAD with out including
30 
31 #include <algorithm>
32 #include <array>
33 #include <cassert>
34 #include <cstddef>
35 #include <cerrno>
36 #include <fstream>
37 #include <iomanip>
38 #include <iosfwd>
39 #include <iostream>
40 #include <limits>
41 #include <list>
42 #include <map>
43 #include <memory>
44 #include <valarray>
45 #include <vector>
46 #include <deque>
47 #include <forward_list>
48 #include <set>
49 #include <cstddef>
50 #include <stdexcept>
51 #include <cstdio>
52 #include <cstdlib>
53 #include <sstream>
54 #include <string>
55 #include <cstring>
56 #include <chrono>
57 #include <thread>
58 #include <functional>
59 
60 // ---------------------------------------------------------------------------
61 // operating system detection
62 #ifndef CPPAD_CG_SYSTEM_LINUX
63 # if defined(__linux__) || defined(__linux) || defined(linux)
64 # define CPPAD_CG_SYSTEM_LINUX 1
65 # endif
66 #endif
67 #ifndef CPPAD_CG_SYSTEM_APPLE
68 # if defined(__APPLE__)
69 # define CPPAD_CG_SYSTEM_APPLE 1
70 # define CPPAD_CG_SYSTEM_LINUX 1
71 # endif
72 #endif
73 #ifndef CPPAD_CG_SYSTEM_WIN
74 # if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__)
75 # define CPPAD_CG_SYSTEM_WIN 1
76 # endif
77 #endif
78 
79 // ---------------------------------------------------------------------------
80 // all base type requirements
81 # include <cppad/base_require.hpp>
82 
83 // ---------------------------------------------------------------------------
84 #include <cppad/cg/cppadcg_assert.hpp>
85 #include <cppad/cg/exception.hpp>
86 #include <cppad/cg/operation.hpp>
87 #include <cppad/cg/declare_cg.hpp>
88 
89 // ---------------------------------------------------------------------------
90 // system dependent files
91 #include <cppad/cg/model/system/system.hpp>
92 #include <cppad/cg/model/system/linux_system.hpp>
93 
94 // ---------------------------------------------------------------------------
95 // some utilities
96 #include <cppad/cg/smart_containers.hpp>
97 #include <cppad/cg/ostream_config_restore.hpp>
98 #include <cppad/cg/array_view.hpp>
99 
100 // ---------------------------------------------------------------------------
101 // indexes
102 #include <cppad/cg/patterns/index/index_pattern.hpp>
103 #include <cppad/cg/patterns/index/linear_index_pattern.hpp>
104 #include <cppad/cg/patterns/index/sectioned_index_pattern.hpp>
105 #include <cppad/cg/patterns/index/plane_2d_index_pattern.hpp>
106 #include <cppad/cg/patterns/index/random_index_pattern.hpp>
107 #include <cppad/cg/patterns/index/random_1d_index_pattern.hpp>
108 #include <cppad/cg/patterns/index/random_2d_index_pattern.hpp>
109 #include <cppad/cg/patterns/index/index_pattern_impl.hpp>
110 
111 // ---------------------------------------------------------------------------
112 // core files
113 #include <cppad/cg/debug.hpp>
114 #include <cppad/cg/argument.hpp>
115 #include <cppad/cg/operation_node.hpp>
116 #include <cppad/cg/operation_stack.hpp>
117 #include <cppad/cg/nodes/index_operation_node.hpp>
118 #include <cppad/cg/nodes/index_assign_operation_node.hpp>
119 #include <cppad/cg/nodes/loop_start_operation_node.hpp>
120 #include <cppad/cg/nodes/loop_end_operation_node.hpp>
121 #include <cppad/cg/nodes/print_operation_node.hpp>
122 #include <cppad/cg/cg.hpp>
123 #include <cppad/cg/default.hpp>
124 #include <cppad/cg/variable.hpp>
125 #include <cppad/cg/identical.hpp>
126 #include <cppad/cg/range.hpp>
127 #include <cppad/cg/atomic_dependency_locator.hpp>
128 #include <cppad/cg/variable_name_generator.hpp>
129 #include <cppad/cg/job_timer.hpp>
130 #include <cppad/cg/lang/language.hpp>
131 #include <cppad/cg/lang/lang_stream_stack.hpp>
132 #include <cppad/cg/scope_path_element.hpp>
133 #include <cppad/cg/array_id_compresser.hpp>
134 #include <cppad/cg/patterns/loop_position.hpp>
135 #include <cppad/cg/arithmetic.hpp>
136 #include <cppad/cg/arithmetic_assign.hpp>
137 #include <cppad/cg/math.hpp>
138 #include <cppad/cg/math_other.hpp>
139 #include <cppad/cg/nan.hpp>
140 #include <cppad/cg/cond_exp_op.hpp>
141 #include <cppad/cg/compare.hpp>
142 #include <cppad/cg/ordered.hpp>
143 #include <cppad/cg/unary.hpp>
144 
145 // ---------------------------------------------------------------------------
146 #include <cppad/cg/code_handler.hpp>
147 #include <cppad/cg/code_handler_impl.hpp>
148 #include <cppad/cg/code_handler_vector.hpp>
149 #include <cppad/cg/code_handler_loops.hpp>
150 
151 // ---------------------------------------------------------------------------
152 #include <cppad/cg/base_double.hpp>
153 #include <cppad/cg/base_float.hpp>
154 
155 // ---------------------------------------------------------------------------
156 // CppAD
157 #include <cppad/cppad.hpp>
158 
159 // resolves some ambiguities
160 #include <cppad/cg/arithmetic_ad.hpp>
161 
162 // addons
163 #include <cppad/cg/extra/extra.hpp>
164 
165 // ---------------------------------------------------------------------------
166 // additional utilities
167 #include <cppad/cg/util.hpp>
168 #include <cppad/cg/evaluator/evaluator.hpp>
169 #include <cppad/cg/evaluator/evaluator_ad.hpp>
170 #include <cppad/cg/evaluator/evaluator_adcg.hpp>
171 #include <cppad/cg/evaluator/evaluator_cg.hpp>
172 #include <cppad/cg/operation_path_node.hpp>
173 #include <cppad/cg/operation_path.hpp>
174 #include <cppad/cg/solver.hpp>
175 #include <cppad/cg/collect_variable.hpp>
176 #include <cppad/cg/graph_mod.hpp>
177 #include <cppad/cg/operation_node_name_streambuf.hpp>
178 
179 // ---------------------------------------------------------------------------
180 // atomic function utilities
181 #include <cppad/cg/custom_position.hpp>
182 #include <cppad/cg/base_abstract_atomic_fun.hpp>
183 #include <cppad/cg/abstract_atomic_fun.hpp>
184 #include <cppad/cg/atomic_fun.hpp>
185 #include <cppad/cg/atomic_fun_bridge.hpp>
186 #include <cppad/cg/model/atomic_generic_model.hpp>
187 
188 // ---------------------------------------------------------------------------
189 // loop/pattern detection
190 #include <cppad/cg/patterns/independent_node_sorter.hpp>
191 #include <cppad/cg/patterns/equation_group.hpp>
192 #include <cppad/cg/patterns/iter_equation_group.hpp>
193 #include <cppad/cg/patterns/loop_model.hpp>
194 #include <cppad/cg/patterns/loop_free_model.hpp>
195 #include <cppad/cg/patterns/equation_pattern.hpp>
196 #include <cppad/cg/patterns/loop.hpp>
197 #include <cppad/cg/patterns/dependent_pattern_matcher.hpp>
198 
199 // ---------------------------------------------------------------------------
200 // C source code generation
201 #include <cppad/cg/lang/c/lang_c_atomic_fun.hpp>
202 #include <cppad/cg/lang/c/language_c.hpp>
203 #include <cppad/cg/lang/c/language_c_arrays.hpp>
204 #include <cppad/cg/lang/c/language_c_index_patterns.hpp>
205 #include <cppad/cg/lang/c/language_c_double.hpp>
206 #include <cppad/cg/lang/c/language_c_float.hpp>
207 #include <cppad/cg/lang/c/language_c_loops.hpp>
208 #include <cppad/cg/lang/c/lang_c_default_var_name_gen.hpp>
209 #include <cppad/cg/lang/c/lang_c_default_hessian_var_name_gen.hpp>
210 #include <cppad/cg/lang/c/lang_c_default_reverse2_var_name_gen.hpp>
211 #include <cppad/cg/lang/c/lang_c_custom_var_name_gen.hpp>
212 #include <cppad/cg/lang/c/lang_c_util.hpp>
213 
214 //
215 #include <cppad/cg/model/threadpool/multi_threading_type.hpp>
216 #include <cppad/cg/model/threadpool/thread_pool_schedule_strategy.hpp>
217 #include <cppad/cg/model/external_function_wrapper.hpp>
218 #include <cppad/cg/model/atomic_external_function_wrapper.hpp>
219 #include <cppad/cg/model/generic_model_external_function_wrapper.hpp>
220 #include <cppad/cg/model/model_library_processor.hpp>
221 #include <cppad/cg/model/model_library.hpp>
222 #include <cppad/cg/model/generic_model.hpp>
223 #include <cppad/cg/model/functor_generic_model.hpp>
224 #include <cppad/cg/model/functor_model_library.hpp>
225 #include <cppad/cg/model/save_files_model_library_processor.hpp>
226 
227 // automated static library creation
228 #include <cppad/cg/model/dynamic_lib/archiver.hpp>
229 #include <cppad/cg/model/dynamic_lib/ar_archiver.hpp>
230 
231 // compiler
232 #include <cppad/cg/model/compiler/c_compiler.hpp>
233 #include <cppad/cg/model/compiler/abstract_c_compiler.hpp>
234 #include <cppad/cg/model/compiler/gcc_compiler.hpp>
235 #include <cppad/cg/model/compiler/clang_compiler.hpp>
236 
237 // model source code generation helpers
238 #include <cppad/cg/model/threadpool/pthread_pool_c.hpp>
239 #include <cppad/cg/model/threadpool/pthread_pool_h.hpp>
240 #include <cppad/cg/model/threadpool/openmp_c.hpp>
241 #include <cppad/cg/model/threadpool/openmp_h.hpp>
242 #include <cppad/cg/model/model_c_source_gen.hpp>
243 #include <cppad/cg/model/model_c_source_gen_impl.hpp>
244 #include <cppad/cg/model/model_library_c_source_gen.hpp>
245 #include <cppad/cg/model/model_library_c_source_gen_impl.hpp>
246 
247 #include <cppad/cg/model/model_c_source_gen_for0.hpp>
248 #include <cppad/cg/model/model_c_source_gen_for1.hpp>
249 #include <cppad/cg/model/model_c_source_gen_rev1.hpp>
250 #include <cppad/cg/model/model_c_source_gen_rev2.hpp>
251 #include <cppad/cg/model/model_c_source_gen_jac.hpp>
252 #include <cppad/cg/model/model_c_source_gen_hes.hpp>
253 #include <cppad/cg/model/patterns/model_c_source_gen_loops.hpp>
254 #include <cppad/cg/model/patterns/model_c_source_gen_loops_for0.hpp>
255 #include <cppad/cg/model/patterns/model_c_source_gen_loops_for1.hpp>
256 #include <cppad/cg/model/patterns/model_c_source_gen_loops_jac.hpp>
257 #include <cppad/cg/model/patterns/model_c_source_gen_loops_jac_fr1.hpp>
258 #include <cppad/cg/model/patterns/model_c_source_gen_loops_hess.hpp>
259 #include <cppad/cg/model/patterns/model_c_source_gen_loops_rev1.hpp>
260 #include <cppad/cg/model/patterns/model_c_source_gen_loops_rev2.hpp>
261 #include <cppad/cg/model/patterns/model_c_source_gen_loops_hess_r2.hpp>
262 #include <cppad/cg/model/patterns/hessian_with_loops_info.hpp>
263 
264 // automated dynamic library creation
265 #include <cppad/cg/model/dynamic_lib/dynamiclib.hpp>
266 #include <cppad/cg/model/dynamic_lib/dynamic_library_processor.hpp>
267 
268 // ---------------------------------------------------------------------------
269 // automated dynamic library creation for Linux
270 #include <cppad/cg/model/dynamic_lib/linux/linux_dynamiclib_model.hpp>
271 #include <cppad/cg/model/dynamic_lib/linux/linux_dynamiclib.hpp>
272 #include <cppad/cg/model/dynamic_lib/linux/linux_dynamic_model_library_processor.hpp>
273 
274 #endif
275