1 #ifndef CPPAD_CG_LANG_MATHML_DEFAULT_VAR_NAME_GEN_INCLUDED
2 #define CPPAD_CG_LANG_MATHML_DEFAULT_VAR_NAME_GEN_INCLUDED
31 std::stringstream _ss;
35 std::string _indepName;
39 std::string _tmpArrayName;
41 std::string _tmpSparseArrayName;
43 size_t _minTemporaryID;
45 size_t _maxTemporaryID;
47 size_t _maxTemporaryArrayID;
49 size_t _maxTemporarySparseArrayID;
53 std::string indepName =
"x",
54 std::string tmpName =
"v",
55 std::string tmpArrayName =
"a",
56 std::string tmpSparseArrayName =
"s") :
57 _depName(std::move(depName)),
58 _indepName(std::move(indepName)),
59 _tmpName(std::move(tmpName)),
60 _tmpArrayName(std::move(tmpArrayName)),
61 _tmpSparseArrayName(std::move(tmpSparseArrayName)),
64 _maxTemporaryArrayID(0),
65 _maxTemporarySparseArrayID(0) {
71 this->_temporary.push_back(
FuncArgument(_tmpSparseArrayName));
77 return _minTemporaryID;
81 return _maxTemporaryID;
85 return _maxTemporaryArrayID;
89 return _maxTemporarySparseArrayID;
97 "<mi>" << _depName <<
"</mi>"
98 "<mn>" << index <<
"</mn>"
105 size_t id)
override {
110 "<mi>" << _indepName <<
"</mi>"
111 "<mn>" << (
id - 1) <<
"</mn>"
118 size_t id)
override {
122 if (this->_temporary[0].array) {
124 "<mi>" << _tmpName <<
"</mi>"
125 "<mn>" << (
id - this->_minTemporaryID) <<
"</mn>"
129 "<mi>" << _tmpName <<
"</mi>"
130 "<mn>" <<
id <<
"</mn>"
138 size_t id)
override {
142 CPPADCG_ASSERT_UNKNOWN(variable.
getOperationType() == CGOpCode::ArrayCreation)
144 _ss <<
"<mi>" << _tmpArrayName <<
"</mi>"
145 "<mfenced open='[' close=']'>"
147 "<mn>" <<
id - 1 <<
"</mn>"
156 size_t id)
override {
160 CPPADCG_ASSERT_UNKNOWN(variable.
getOperationType() == CGOpCode::SparseArrayCreation)
162 _ss <<
"<mi>" << _tmpSparseArrayName <<
"</mi>"
163 "<mfenced open='[' close=']'>"
165 "<mn>" <<
id - 1 <<
"</mn>"
176 CPPADCG_ASSERT_KNOWN(var.
getOperationType() == CGOpCode::LoopIndexedDep,
"Invalid node type")
177 CPPADCG_ASSERT_KNOWN(!var.
getArguments().empty(),
"Invalid number of arguments")
183 "<mi>" << _depName <<
"</mi>"
195 CPPADCG_ASSERT_KNOWN(independent.
getOperationType() == CGOpCode::LoopIndexedIndep,
"Invalid node type")
196 CPPADCG_ASSERT_KNOWN(independent.
getArguments().size() > 0,
"Invalid number of arguments")
203 "<mi>" << _indepName <<
"</mi>"
214 size_t maxTempArrayID,
215 size_t maxTempSparseArrayID)
override {
216 _minTemporaryID = minTempID;
217 _maxTemporaryID = maxTempID;
218 _maxTemporaryArrayID = maxTempArrayID;
219 _maxTemporarySparseArrayID = maxTempSparseArrayID;
224 CPPADCG_ASSERT_UNKNOWN(_minTemporaryID <= _maxTemporaryID + 1)
228 size_t id)
override {
233 size_t id)
override {
240 size_t idSecond)
override {
241 return idFirst + 1 == idSecond;
247 size_t id2)
override {
252 size_t id)
override {
257 size_t id)
override {
258 return id - this->_minTemporaryID;
264 size_t idSecond)
override {
265 return idFirst + 1 == idSecond;
271 size_t id2)
override {
277 static inline std::vector<const OperationNode<Base>*> getIndexes(
const OperationNode<Base>& var,
279 const std::vector<Argument<Base> >& args = var.
getArguments();
280 std::vector<const OperationNode<Base>*> indexes(args.size() - offset);
282 for (
size_t a = offset; a < args.size(); a++) {
283 CPPADCG_ASSERT_KNOWN(args[a].getOperation() !=
nullptr,
"Invalid argument")
284 CPPADCG_ASSERT_KNOWN(args[a].getOperation()->getOperationType() == CGOpCode::Index, "Invalid argument")
286 indexes[a - offset] = &static_cast<const
IndexOperationNode<Base>*> (args[a].getOperation())->getIndex();