1 #ifndef CPPAD_CG_LANGUAGE_C_LOOPS_INCLUDED 2 #define CPPAD_CG_LANGUAGE_C_LOOPS_INCLUDED 23 void LanguageC<Base>::pushLoopIndexedDep(OperationNode <Base>& node) {
24 CPPADCG_ASSERT_KNOWN(node.getArguments().size() >= 1,
"Invalid number of arguments for loop indexed dependent operation")
27 push(node.getArguments()[0]);
31 size_t LanguageC<Base>::printLoopIndexDeps(
const std::vector<OperationNode<Base>*>& variableOrder,
33 CPPADCG_ASSERT_KNOWN(pos < variableOrder.size(),
"Invalid number of arguments for array creation operation")
34 CPPADCG_ASSERT_KNOWN(variableOrder[pos]->getOperationType() == CGOpCode::LoopIndexedDep,
"Invalid operation type")
36 const size_t vSize = variableOrder.size();
38 for (
size_t i = pos; i < vSize; i++) {
39 if (variableOrder[i]->getOperationType() != CGOpCode::LoopIndexedDep) {
44 size_t newI = printLoopIndexedDepsUsingLoop(variableOrder, i);
48 printAssignment(*variableOrder[i]);
60 CPPADCG_ASSERT_KNOWN(variableOrder[starti] !=
nullptr,
"Invalid node")
61 CPPADCG_ASSERT_KNOWN(variableOrder[starti]->getOperationType() == CGOpCode::LoopIndexedDep,
"Invalid operation type")
63 const size_t vSize = variableOrder.size();
68 size_t refAssignOrAdd = ref.
getInfo()[1];
74 if (refLeft ==
nullptr) {
86 if (refIp->getType() == IndexPatternType::Linear) {
88 }
else if (refIp->getType() == IndexPatternType::Sectioned) {
98 const size_t startArrayIndex = refLeft->
getInfo()[0];
100 size_t i = starti + 1;
102 for (; i < vSize; i++) {
112 if (arrayi != refArray)
115 long offset = long(i) - long(starti);
117 if (nodeLeft->
getInfo()[0] != startArrayIndex + offset)
120 if (node->
getInfo()[1] != refAssignOrAdd)
124 if (!isOffsetBy(ip, refIp, offset)) {
135 std::unique_ptr<Plane2DIndexPattern> p2dip;
136 if (refLIp !=
nullptr) {
137 p2dip.reset(encapsulateIndexPattern(*refLIp, 0));
139 assert(refSecp !=
nullptr);
140 p2dip.reset(encapsulateIndexPattern(*refSecp, 0));
144 op2->getInfo()[1] = (std::numeric_limits<size_t>::max)();
145 op2->getArguments().push_back(_info->auxIterationIndexOp);
147 std::ostringstream rightAssign;
149 rightAssign << _nameGen->generateIndexedDependent(*op2, 0, *p2dip);
154 size_t depVarCount = i - starti;
155 _streamStack << _indentation <<
"for(i = 0; i < " << depVarCount <<
"; i++) ";
156 _streamStack << rightAssign.str() <<
" ";
157 if (refAssignOrAdd == 1) {
158 _streamStack <<
"+=";
160 _streamStack << _depAssignOperation;
164 std::string arrayName;
166 arrayName = _nameGen->generateTemporaryArray(*refArray, getVariableID(*refArray));
168 arrayName = _nameGen->generateTemporarySparseArray(*refArray, getVariableID(*refArray));
170 _streamStack <<
"(" << arrayName <<
")[i + " << startArrayIndex <<
"];\n";
const std::vector< Argument< Base > > & getArguments() const
CGOpCode getOperationType() const
virtual size_t printLoopIndexedDepsUsingLoop(const std::vector< Node *> &variableOrder, size_t starti)
const std::vector< size_t > & getInfo() const