1#ifndef CPPAD_CG_LANG_C_DEFAULT_REVERSE2_VAR_NAME_GEN_INCLUDED
2#define CPPAD_CG_LANG_C_DEFAULT_REVERSE2_VAR_NAME_GEN_INCLUDED
35 const size_t _minLevel1ID;
37 const std::string _level1Name;
39 const size_t _minLevel2ID;
41 const std::string _level2Name;
43 std::stringstream _ss;
52 _minLevel2ID(_minLevel1ID + n1),
55 CPPADCG_ASSERT_KNOWN(_nameGen !=
nullptr,
"The name generator must not be null")
62 std::string level1Name,
64 std::string level2Name) :
67 _level1Name(std::move(level1Name)),
68 _minLevel2ID(_minLevel1ID + n1),
69 _level2Name(std::move(level2Name)) {
71 CPPADCG_ASSERT_KNOWN(_nameGen !=
nullptr,
"The name generator must not be null")
72 CPPADCG_ASSERT_KNOWN(_level1Name.size() > 0,
"The name for the first level must not be empty")
73 CPPADCG_ASSERT_KNOWN(_level2Name.size() > 0,
"The name for the second level must not be empty")
78 inline virtual ~LangCDefaultReverse2VarNameGenerator() =
default;
81 return _nameGen->getDependent();
85 return _nameGen->getTemporary();
89 return _nameGen->getMinTemporaryVariableID();
93 return _nameGen->getMaxTemporaryVariableID();
97 return _nameGen->getMaxTemporaryArrayVariableID();
101 return _nameGen->getMaxTemporarySparseArrayVariableID();
105 return _nameGen->generateDependent(index);
109 size_t id)
override {
110 if (
id < _minLevel1ID) {
111 return _nameGen->generateIndependent(independent,
id);
115 if (
id < _minLevel2ID) {
116 _ss << _level1Name <<
"[" << (
id - _minLevel1ID) <<
"]";
118 _ss << _level2Name <<
"[" << (
id - _minLevel2ID) <<
"]";
125 size_t id)
override {
126 return _nameGen->generateTemporary(variable,
id);
130 size_t id)
override {
131 return _nameGen->generateTemporaryArray(variable,
id);
135 size_t id)
override {
136 return _nameGen->generateTemporarySparseArray(variable,
id);
142 return _nameGen->generateIndexedDependent(var,
id, ip);
148 size_t varType = independent.
getInfo()[0];
150 return _nameGen->generateIndexedIndependent(independent,
id, ip);
154 CPPADCG_ASSERT_KNOWN(independent.
getOperationType() == CGOpCode::LoopIndexedIndep,
"Invalid node type")
155 CPPADCG_ASSERT_KNOWN(nIndex > 0,
"Invalid number of arguments")
160 std::vector<const OperationNode<Base>*> indices(nIndex);
161 for (
size_t i = 0; i < nIndex; ++i) {
162 CPPADCG_ASSERT_KNOWN(independent.
getArguments()[i].getOperation() !=
nullptr,
"Invalid argument")
163 CPPADCG_ASSERT_KNOWN(independent.
getArguments()[i].getOperation()->getOperationType() == CGOpCode::Index,
"Invalid argument")
168 _ss << _level1Name <<
"[" << LanguageC<Base>::indexPattern2String(ip, indices) <<
"]";
170 _ss << _level2Name <<
"[" << LanguageC<Base>::indexPattern2String(ip, indices) <<
"]";
178 size_t id)
override {
179 if (
id < _minLevel1ID)
180 return _nameGen->getIndependentArrayName(indep,
id);
181 else if (
id < _minLevel2ID)
188 size_t id)
override {
189 if (
id < _minLevel1ID)
190 return _nameGen->getIndependentArrayIndex(indep,
id);
191 else if (
id < _minLevel2ID)
192 return id - _minLevel1ID;
194 return id - _minLevel2ID;
200 size_t id2)
override {
201 if ((id1 < _minLevel1ID) != (id2 < _minLevel1ID))
204 if (id1 < _minLevel1ID && id2 < _minLevel1ID)
205 return _nameGen->isConsecutiveInIndepArray(indepFirst, id1, indepSecond, id2);
207 if ((id1 < _minLevel2ID) != (id2 < _minLevel2ID))
210 return id1 + 1 == id2;
216 size_t id2)
override {
219 l1 = id1 < _minLevel1ID ? 0 : (id1 < _minLevel2ID ? 1 : 2);
226 l2 = id2 < _minLevel1ID ? 0 : (id2 < _minLevel2ID ? 1 : 2);
235 size_t id)
override {
236 return _nameGen->getTemporaryVarArrayName(var,
id);
240 size_t id)
override {
241 return _nameGen->getTemporaryVarArrayIndex(var,
id);
247 size_t idSecond)
override {
248 return _nameGen->isConsecutiveInTemporaryVarArray(varFirst, idFirst, varSecond, idSecond);
254 size_t id2)
override {
255 return _nameGen->isInSameTemporaryVarArray(var1, id1, var2, id2);
260 size_t maxTempArrayID,
261 size_t maxTempSparseArrayID)
override {
262 _nameGen->setTemporaryVariableID(minTempID, maxTempID, maxTempArrayID, maxTempSparseArrayID);
267 inline void initialize() {
269 this->_independent.push_back(
FuncArgument(_level1Name));
270 this->_independent.push_back(
FuncArgument(_level2Name));
size_t getMaxTemporaryArrayVariableID() const override
void setTemporaryVariableID(size_t minTempID, size_t maxTempID, size_t maxTempArrayID, size_t maxTempSparseArrayID) override
bool isConsecutiveInTemporaryVarArray(const OperationNode< Base > &varFirst, size_t idFirst, const OperationNode< Base > &varSecond, size_t idSecond) override
const std::vector< FuncArgument > & getDependent() const override
std::string generateIndexedIndependent(const OperationNode< Base > &independent, size_t id, const IndexPattern &ip) override
size_t getIndependentArrayIndex(const OperationNode< Base > &indep, size_t id) override
const std::string & getTemporaryVarArrayName(const OperationNode< Base > &var, size_t id) override
std::string generateIndependent(const OperationNode< Base > &independent, size_t id) override
std::string generateTemporary(const OperationNode< Base > &variable, size_t id) override
size_t getMaxTemporaryVariableID() const override
std::string generateTemporarySparseArray(const OperationNode< Base > &variable, size_t id) override
bool isInSameIndependentArray(const OperationNode< Base > &indep1, size_t id1, const OperationNode< Base > &indep2, size_t id2) override
std::string generateTemporaryArray(const OperationNode< Base > &variable, size_t id) override
const std::string & getIndependentArrayName(const OperationNode< Base > &indep, size_t id) override
bool isInSameTemporaryVarArray(const OperationNode< Base > &var1, size_t id1, const OperationNode< Base > &var2, size_t id2) override
std::string generateDependent(size_t index) override
std::string generateIndexedDependent(const OperationNode< Base > &var, size_t id, const IndexPattern &ip) override
size_t getMinTemporaryVariableID() const override
size_t getMaxTemporarySparseArrayVariableID() const override
size_t getTemporaryVarArrayIndex(const OperationNode< Base > &var, size_t id) override
bool isConsecutiveInIndepArray(const OperationNode< Base > &indepFirst, size_t id1, const OperationNode< Base > &indepSecond, size_t id2) override
const std::vector< FuncArgument > & getTemporary() const override
const std::vector< size_t > & getInfo() const
const std::vector< Argument< Base > > & getArguments() const
CGOpCode getOperationType() const
virtual const std::vector< FuncArgument > & getIndependent() const