1 #ifndef CPPAD_CG_LANGUAGE_C_LOOPS_INCLUDED 2 #define CPPAD_CG_LANGUAGE_C_LOOPS_INCLUDED 22 void LanguageC<Base>::printLoopIndexedDep(OperationNode<Base>& node) {
23 CPPADCG_ASSERT_KNOWN(node.getArguments().size() >= 1,
"Invalid number of arguments for loop indexed dependent operation");
26 print(node.getArguments()[0]);
30 size_t LanguageC<Base>::printLoopIndexDeps(
const std::vector<OperationNode<Base>*>& variableOrder,
32 CPPADCG_ASSERT_KNOWN(pos < variableOrder.size(),
"Invalid number of arguments for array creation operation");
33 CPPADCG_ASSERT_KNOWN(variableOrder[pos]->getOperationType() == CGOpCode::LoopIndexedDep,
"Invalid operation type");
35 const size_t vSize = variableOrder.size();
37 for (
size_t i = pos; i < vSize; i++) {
38 if (variableOrder[i]->getOperationType() != CGOpCode::LoopIndexedDep) {
43 size_t newI = printLoopIndexedDepsUsingLoop(variableOrder, i);
47 printAssignment(*variableOrder[i]);
59 CPPADCG_ASSERT_KNOWN(variableOrder[starti] !=
nullptr,
"Invalid node");
60 CPPADCG_ASSERT_KNOWN(variableOrder[starti]->getOperationType() == CGOpCode::LoopIndexedDep,
"Invalid operation type");
62 const size_t vSize = variableOrder.size();
67 size_t refAssignOrAdd = ref.
getInfo()[1];
73 if (refLeft ==
nullptr) {
85 if (refIp->getType() == IndexPatternType::Linear) {
87 }
else if (refIp->getType() == IndexPatternType::Sectioned) {
97 const size_t startArrayIndex = refLeft->
getInfo()[0];
99 size_t i = starti + 1;
101 for (; i < vSize; i++) {
111 if (arrayi != refArray)
114 long offset = long(i) - long(starti);
116 if (nodeLeft->
getInfo()[0] != startArrayIndex + offset)
119 if (node->
getInfo()[1] != refAssignOrAdd)
123 if (!isOffsetBy(ip, refIp, offset)) {
134 std::unique_ptr<Plane2DIndexPattern> p2dip;
135 if (refLIp !=
nullptr) {
136 p2dip.reset(encapsulateIndexPattern(*refLIp, 0));
138 assert(refSecp !=
nullptr);
139 p2dip.reset(encapsulateIndexPattern(*refSecp, 0));
143 op2->getInfo()[1] = std::numeric_limits<size_t>::max();
144 op2->getArguments().push_back(_info->auxIterationIndexOp);
146 std::ostringstream rightAssign;
148 rightAssign << _nameGen->generateIndexedDependent(*op2, 0, *p2dip);
153 size_t depVarCount = i - starti;
154 _code << _indentation <<
"for(i = 0; i < " << depVarCount <<
"; i++) ";
155 _code << rightAssign.str() <<
" ";
156 if (refAssignOrAdd == 1) {
159 _code << _depAssignOperation;
163 std::string arrayName;
165 arrayName = _nameGen->generateTemporaryArray(*refArray, getVariableID(*refArray));
167 arrayName = _nameGen->generateTemporarySparseArray(*refArray, getVariableID(*refArray));
169 _code <<
"(" << 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