41 using SparsitySetType = std::vector<std::set<size_t> >;
42 using TapeVarType = std::pair<size_t, size_t>;
44 static const std::string FUNCTION_FORWAD_ZERO;
45 static const std::string FUNCTION_JACOBIAN;
46 static const std::string FUNCTION_HESSIAN;
47 static const std::string FUNCTION_FORWARD_ONE;
48 static const std::string FUNCTION_REVERSE_ONE;
49 static const std::string FUNCTION_REVERSE_TWO;
50 static const std::string FUNCTION_SPARSE_JACOBIAN;
51 static const std::string FUNCTION_SPARSE_HESSIAN;
52 static const std::string FUNCTION_JACOBIAN_SPARSITY;
53 static const std::string FUNCTION_HESSIAN_SPARSITY;
54 static const std::string FUNCTION_HESSIAN_SPARSITY2;
55 static const std::string FUNCTION_SPARSE_FORWARD_ONE;
56 static const std::string FUNCTION_SPARSE_REVERSE_ONE;
57 static const std::string FUNCTION_SPARSE_REVERSE_TWO;
58 static const std::string FUNCTION_FORWARD_ONE_SPARSITY;
59 static const std::string FUNCTION_REVERSE_ONE_SPARSITY;
60 static const std::string FUNCTION_REVERSE_TWO_SPARSITY;
61 static const std::string FUNCTION_INFO;
62 static const std::string FUNCTION_ATOMIC_FUNC_NAMES;
64 static const std::string CONST;
72 std::vector<size_t> row;
73 std::vector<size_t> col;
79 inline Position(
const std::vector<size_t>&
r,
const std::vector<size_t>&
c) :
83 CPPADCG_ASSERT_KNOWN(
r.size() ==
c.size(),
"The number of row indexes must be the same as the number of column indexes.")
86 template<
class VectorSet>
87 inline Position(
const VectorSet& elements) :
90 for (
size_t i = 0;
i < elements.size();
i++) {
91 nnz += elements[
i].size();
97 for (
size_t i = 0;
i < elements.size();
i++) {
98 for (
size_t it : elements[
i]) {
118 std::vector<size_t> rows;
120 std::vector<size_t> cols;
167 std::vector<Base>
_x;
206 JacobianADMode _jacMode;
244 std::vector<std::set<size_t> > _relatedDepCandidates;
249 std::map<LoopModel<Base>*, std::map<size_t, std::map<size_t, std::set<size_t> > > >
_loopFor1Groups;
259 std::map<LoopModel<Base>*, std::map<size_t, std::map<size_t, std::set<size_t> > > >
_loopRev1Groups;
269 std::map<LoopModel<Base>*, std::map<size_t, std::map<size_t, std::set<size_t> > > >
_loopRev2Groups;
301 _zeroEvaluated(
false),
312 _jacMode(JacobianADMode::Automatic),
318 CPPADCG_ASSERT_KNOWN(!
_name.empty(),
"Model name cannot be empty");
319 CPPADCG_ASSERT_KNOWN((
_name[0] >=
'a' &&
_name[0] <=
'z') ||
321 "Invalid model name character");
322 for (
size_t i = 1;
i <
_name.size();
i++) {
324 CPPADCG_ASSERT_KNOWN((
c >=
'a' &&
c <=
'z') ||
325 (
c >=
'A' &&
c <=
'Z') ||
326 (
c >=
'0' &&
c <=
'9') ||
328 ,
"Invalid model name character");
352 template<
class VectorBase>
355 "Invalid independent variable vector size")
357 for (
size_t i = 0;
i < x.size();
i++) {
366 inline const std::vector<std::set<size_t> >& getRelatedDependents()
const {
367 return _relatedDepCandidates;
423 inline bool isJacobianMultiThreadingEnabled()
const {
427 inline bool isHessianMultiThreadingEnabled()
const {
803 const std::vector<size_t>& col) {
816 template<
class VectorSet>
834 const std::vector<size_t>& col) {
849 template<
class VectorSet>
909 static inline std::string baseTypeName();
912 static void generateFunctionDeclarationSource(std::ostringstream&
cache,
914 const std::string&
suffix,
915 const std::map<size_t, T>& elements,
922 const std::string&
tmpName =
"v",
925 const std::map<std::string, std::string>& getSources(MultiThreadingType
multiThreadingType,
929 JobTimer*
timer =
nullptr);
931 virtual void generateLoops();
933 virtual void generateInfoSource();
935 virtual void generateAtomicFuncNames();
937 virtual bool isAtomicsUsed();
939 virtual const std::map<size_t, AtomicUseInfo<Base> >& getAtomicsInfo();
951 const std::vector<CGBase>& x);
957 virtual void generateJacobianSource();
966 virtual std::string generateSparseJacobianForRevSingleThreadSource(
const std::string&
functionName,
967 std::map<size_t, CompressedVectorInfo>
jacInfo,
974 std::map<size_t, CompressedVectorInfo>
jacInfo,
1002 const std::vector<CGBase>& x,
1008 const loops::JacobianWithLoopsRowInfo&
rowInfo,
1009 const std::vector<std::map<size_t, CGBase> >&
dyiDxtape,
1010 const std::vector<std::map<size_t, CGBase> >&
dzDx,
1013 std::vector<loops::IfElseInfo<Base> >& ifElses,
1019 const std::vector<size_t>& cols,
1020 const std::vector<size_t>& location,
1024 std::map<LoopModel<Base>*, std::vector<loops::JacobianWithLoopsRowInfo> >&
loopEqInfo);
1030 const std::string&
suffix,
1033 const std::map<LoopModel<Base>*, std::map<
size_t, std::map<
size_t, std::set<size_t> > > >&
loopGroups,
1036 inline virtual void generateFunctionNameLoopFor1(std::ostringstream&
cache,
1037 const LoopModel<Base>&
loop,
1040 inline static void generateFunctionNameLoopFor1(std::ostringstream&
cache,
1042 const LoopModel<Base>&
loop,
1045 inline virtual void generateFunctionNameLoopRev1(std::ostringstream&
cache,
1046 const LoopModel<Base>&
loop,
1049 inline static void generateFunctionNameLoopRev1(std::ostringstream&
cache,
1051 const LoopModel<Base>&
loop,
1058 virtual void generateHessianSource();
1066 virtual std::string generateSparseHessianRev2SingleThreadSource(
const std::string&
functionName,
1067 std::map<size_t, CompressedVectorInfo>
hessInfo,
1073 std::map<size_t, CompressedVectorInfo>
hessInfo,
1110 std::vector<CGBase>& w,
1122 std::map<LoopModel<Base>*, loops::HessianWithLoopsInfo<Base> >&
loopHessInfo,
1128 inline virtual void generateFunctionNameLoopRev2(std::ostringstream&
cache,
1129 const LoopModel<Base>&
loop,
1132 static inline void generateFunctionNameLoopRev2(std::ostringstream&
cache,
1134 const LoopModel<Base>&
loop,
1141 virtual void generateSparsity1DSource(
const std::string&
function,
1142 const std::vector<size_t>& sparsity);
1144 virtual void generateSparsity2DSource(
const std::string&
function,
1145 const LocalSparsityInfo& sparsity);
1147 virtual void generateSparsity2DSource2(
const std::string&
function,
1148 const std::vector<LocalSparsityInfo>&
sparsities);
1150 virtual void generateSparsity1DSource2(
const std::string&
function,
1151 const std::map<
size_t, std::vector<size_t> >& rows);
1163 virtual void generateForwardOneSources();
1167 virtual void createForwardOneWithLoopsNL(CodeHandler<Base>&
handler,
1169 std::vector<CG<Base> >&
jacCol);
1172 inline static std::map<size_t, std::map<size_t, CG<Base> > > generateLoopFor1Jac(
ADFun<CGBase>&
fun,
1173 const SparsitySetType& sparsity,
1175 const std::vector<CGBase>&
xl,
1188 virtual void generateReverseOneSources();
1192 virtual void createReverseOneWithLoopsNL(CodeHandler<Base>&
handler,
1194 std::vector<CG<Base> >&
jacRow);
1196 inline static std::vector<std::map<size_t, CGBase> > generateLoopRev1Jac(
ADFun<CGBase>&
fun,
1197 const SparsitySetType& sparsity,
1199 const std::vector<CGBase>&
xl,
1208 virtual void generateSparseReverseTwoSourcesWithAtomics(
const std::map<
size_t, std::vector<size_t> >& elements);
1211 const std::vector<size_t>&
evalRows,
1212 const std::vector<size_t>&
evalCols);
1214 virtual void generateReverseTwoSources();
1219 const std::map<
size_t, std::vector<size_t> >& elements);
1232 virtual void generateJacobianSparsitySource();
1245 inline std::vector<ModelCSourceGen<Base>::Color>
colorByRow(
const std::set<size_t>&
columns,
1246 const SparsitySetType& sparsity);
1248 virtual void generateHessianSparsitySource();
1251 static inline std::map<size_t, std::vector<std::set<size_t> > > determineOrderByCol(
const std::map<
size_t, std::vector<size_t> >& elements,
1252 const LocalSparsityInfo& sparsity);
1254 static inline std::map<size_t, std::vector<std::set<size_t> > > determineOrderByCol(
const std::map<
size_t, std::vector<size_t> >& elements,
1255 const std::vector<size_t>&
userRows,
1256 const std::vector<size_t>&
userCols);
1258 static inline std::vector<std::set<size_t> > determineOrderByCol(
size_t col,
1260 const std::vector<size_t>&
userRows,
1261 const std::vector<size_t>&
userCols);
1263 static inline std::map<size_t, std::vector<std::set<size_t> > > determineOrderByRow(
const std::map<
size_t, std::vector<size_t> >& elements,
1264 const LocalSparsityInfo& sparsity);
1266 static inline std::map<size_t, std::vector<std::set<size_t> > > determineOrderByRow(
const std::map<
size_t, std::vector<size_t> >& elements,
1267 const std::vector<size_t>&
userRows,
1268 const std::vector<size_t>&
userCols);
1270 static inline std::vector<std::set<size_t> > determineOrderByRow(
size_t row,
1272 const std::vector<size_t>&
userRows,
1273 const std::vector<size_t>&
userCols);
1282 static void printFileStartPThreads(std::ostringstream&
cache,
1283 const std::string& baseTypeName);
1285 static void printFunctionStartPThreads(std::ostringstream&
cache,
1288 static void printFunctionEndPThreads(std::ostringstream&
cache,
1291 static void printFileStartOpenMP(std::ostringstream&
cache);
1293 static void printFunctionStartOpenMP(std::ostringstream&
cache,
1296 static void printLoopStartOpenMP(std::ostringstream&
cache,
1299 static void printLoopEndOpenMP(std::ostringstream&
cache,
1305 inline void startingJob(
const std::string&
jobName,
1306 const JobType&
type = JobTypeHolder<>::DEFAULT);
1308 inline void finishedJob();
1311 ModelLibraryCSourceGen<Base>;
1314 ModelLibraryProcessor<Base>;