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")
109 size_t id)
override {
110 if (
id < _minLevel1ID) {
115 if (
id < _minLevel2ID) {
116 _ss << _level1Name <<
"[" << (
id - _minLevel1ID) <<
"]";
118 _ss << _level2Name <<
"[" << (
id - _minLevel2ID) <<
"]";
125 size_t id)
override {
130 size_t id)
override {
135 size_t id)
override {
148 size_t varType = independent.
getInfo()[0];
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")
178 size_t id)
override {
179 if (
id < _minLevel1ID)
181 else if (
id < _minLevel2ID)
188 size_t id)
override {
189 if (
id < _minLevel1ID)
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)
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 {
240 size_t id)
override {
247 size_t idSecond)
override {
254 size_t id2)
override {
260 size_t maxTempArrayID,
261 size_t maxTempSparseArrayID)
override {
267 inline void initialize() {
269 this->_independent.push_back(
FuncArgument(_level1Name));
270 this->_independent.push_back(
FuncArgument(_level2Name));
virtual std::string generateTemporary(const OperationNode< Base > &variable, size_t id)=0
bool isConsecutiveInIndepArray(const OperationNode< Base > &indepFirst, size_t id1, const OperationNode< Base > &indepSecond, size_t id2) override
size_t getTemporaryVarArrayIndex(const OperationNode< Base > &var, size_t id) override
virtual std::string generateIndexedDependent(const OperationNode< Base > &var, size_t id, const IndexPattern &ip)=0
virtual size_t getMaxTemporaryArrayVariableID() const =0
virtual const std::string & getTemporaryVarArrayName(const OperationNode< Base > &var, size_t id)=0
std::string generateDependent(size_t index) override
bool isInSameTemporaryVarArray(const OperationNode< Base > &var1, size_t id1, const OperationNode< Base > &var2, size_t id2) override
virtual std::string generateIndexedIndependent(const OperationNode< Base > &var, size_t id, const IndexPattern &ip)=0
virtual bool isConsecutiveInTemporaryVarArray(const OperationNode< Base > &varFirst, size_t idFirst, const OperationNode< Base > &varSecond, size_t idSecond)=0
std::string generateIndependent(const OperationNode< Base > &independent, size_t id) override
const std::vector< Argument< Base > > & getArguments() const
virtual const std::vector< FuncArgument > & getTemporary() const
size_t getIndependentArrayIndex(const OperationNode< Base > &indep, size_t id) override
std::string generateTemporaryArray(const OperationNode< Base > &variable, size_t id) override
virtual size_t getIndependentArrayIndex(const OperationNode< Base > &indep, size_t id)=0
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
virtual size_t getMinTemporaryVariableID() const =0
std::string generateIndexedDependent(const OperationNode< Base > &var, size_t id, const IndexPattern &ip) override
const std::string & getTemporaryVarArrayName(const OperationNode< Base > &var, size_t id) override
size_t getMaxTemporarySparseArrayVariableID() const override
virtual std::string generateDependent(size_t index)=0
virtual bool isConsecutiveInIndepArray(const OperationNode< Base > &indepFirst, size_t idFirst, const OperationNode< Base > &indepSecond, size_t idSecond)=0
void setTemporaryVariableID(size_t minTempID, size_t maxTempID, size_t maxTempArrayID, size_t maxTempSparseArrayID) override
std::string generateTemporary(const OperationNode< Base > &variable, size_t id) override
size_t getMaxTemporaryArrayVariableID() const override
const std::vector< FuncArgument > & getDependent() const override
CGOpCode getOperationType() const
virtual void setTemporaryVariableID(size_t minTempID, size_t maxTempID, size_t maxTempArrayID, size_t maxTempSparseArrayID)=0
virtual size_t getTemporaryVarArrayIndex(const OperationNode< Base > &var, size_t id)=0
size_t getMaxTemporaryVariableID() const override
bool isConsecutiveInTemporaryVarArray(const OperationNode< Base > &varFirst, size_t idFirst, const OperationNode< Base > &varSecond, size_t idSecond) override
std::string generateIndexedIndependent(const OperationNode< Base > &independent, size_t id, const IndexPattern &ip) override
const std::vector< FuncArgument > & getTemporary() const override
virtual std::string generateTemporaryArray(const OperationNode< Base > &variable, size_t id)=0
virtual size_t getMaxTemporarySparseArrayVariableID() const =0
virtual const std::vector< FuncArgument > & getDependent() const
virtual std::string generateTemporarySparseArray(const OperationNode< Base > &variable, size_t id)=0
virtual const std::vector< FuncArgument > & getIndependent() const
virtual std::string generateIndependent(const OperationNode< Base > &variable, size_t id)=0
virtual size_t getMaxTemporaryVariableID() const =0
const std::string & getIndependentArrayName(const OperationNode< Base > &indep, size_t id) override
virtual bool isInSameTemporaryVarArray(const OperationNode< Base > &var1, size_t id1, const OperationNode< Base > &var2, size_t id2)=0
size_t getMinTemporaryVariableID() const override
const std::vector< size_t > & getInfo() const
virtual const std::string & getIndependentArrayName(const OperationNode< Base > &indep, size_t id)=0