1#ifndef CPPAD_CG_LANGUAGE_C_ARRAYS_INCLUDED
2#define CPPAD_CG_LANGUAGE_C_ARRAYS_INCLUDED
24 CPPADCG_ASSERT_KNOWN(array.getArguments().size() > 0,
"Invalid number of arguments for array creation operation")
25 const size_t id = getVariableID(array);
26 const std::vector<Argument<Base> >&
args = array.getArguments();
37 _streamStack << _indentation << auxArrayName_ <<
" = " << _nameGen->generateTemporaryArray(array, getVariableID(array)) <<
"; // size: " <<
args.size() <<
"\n";
42 size_t newI = printArrayCreationUsingLoop(
startPos, array,
i, _tmpArrayValues);
46 _streamStack << _indentation << auxArrayName_ <<
"[" <<
i <<
"] = ";
48 _streamStack <<
";\n";
61 const std::vector<size_t>&
info = array.getInfo();
62 CPPADCG_ASSERT_KNOWN(!
info.empty(),
"Invalid number of information elements for sparse array creation operation")
64 const std::vector<Argument<Base> >&
args = array.getArguments();
72 const size_t id = getVariableID(array);
81 _streamStack << _indentation << auxArrayName_ <<
" = " << _nameGen->generateTemporarySparseArray(array, getVariableID(array))
82 <<
"; // nnz: " <<
args.size() <<
" size:" <<
info[0] <<
"\n";
87 size_t newI = printArrayCreationUsingLoop(
startPos, array,
i, _tmpSparseArrayValues);
91 _streamStack << _indentation << auxArrayName_ <<
"[" <<
i <<
"] = ";
95 _streamStack << _C_SPARSE_INDEX_ARRAY <<
"[";
97 _streamStack <<
i <<
"] = " <<
info[
i + 1] <<
";\n";
104 _streamStack << _indentation << _C_SPARSE_INDEX_ARRAY <<
"[";
106 _streamStack <<
j <<
"] = " <<
info[
j + 1] <<
";\n";
115 _streamStack << _indentation
116 << _C_SPARSE_INDEX_ARRAY <<
"[";
118 _streamStack <<
i <<
"] = " <<
info[
i + 1] <<
";\n";
136 if (
ref.getOperation() !=
nullptr) {
140 if (
op == CGOpCode::Inv) {
148 if (
args[
i].getOperation() ==
nullptr ||
149 args[
i].getOperation()->getOperationType() != CGOpCode::Inv ||
150 !_nameGen->isConsecutiveInIndepArray(*
args[
i - 1].getOperation(), getVariableID(*
args[
i - 1].getOperation()),
151 *
args[
i].getOperation(), getVariableID(*
args[
i].getOperation()))) {
160 const std::string&
indep = _nameGen->getIndependentArrayName(
refOp, getVariableID(
refOp));
161 size_t start = _nameGen->getIndependentArrayIndex(
refOp, getVariableID(
refOp));
168 }
else if (
op == CGOpCode::LoopIndexedIndep) {
178 if (
refIp->getType() == IndexPatternType::Linear) {
180 }
else if (
refIp->getType() == IndexPatternType::Sectioned) {
190 if (
args[
i].getOperation() ==
nullptr ||
191 args[
i].getOperation()->getOperationType() != CGOpCode::LoopIndexedIndep) {
195 if (!_nameGen->isInSameIndependentArray(
refOp, getVariableID(
refOp),
196 *
args[
i].getOperation(), getVariableID(*
args[
i].getOperation())))
199 pos =
args[
i].getOperation()->getInfo()[1];
210 std::unique_ptr<Plane2DIndexPattern>
p2dip;
219 op2->getInfo()[1] = (std::numeric_limits<size_t>::max)();
220 op2->getArguments().push_back(_info->auxIterationIndexOp);
223 }
else if (getVariableID(
refOp) >= this->_minTemporaryVarID &&
op != CGOpCode::LoopIndexedDep &&
op != CGOpCode::LoopIndexedTmp &&
op != CGOpCode::Tmp) {
230 else if (
args[
i].getOperation() ==
nullptr)
234 if (getVariableID(
opNode2) < this->_minTemporaryVarID)
238 if (
op2 == CGOpCode::LoopIndexedIndep ||
op2 == CGOpCode::LoopIndexedDep ||
op2 == CGOpCode::LoopIndexedTmp ||
op2 == CGOpCode::Tmp)
241 if (!_nameGen->isConsecutiveInTemporaryVarArray(*
args[
i - 1].getOperation(), getVariableID(*
args[
i - 1].getOperation()),
242 *
args[
i].getOperation(), getVariableID(*
args[
i].getOperation())))
250 const std::string&
tmpName = _nameGen->getTemporaryVarArrayName(
refOp, getVariableID(
refOp));
251 size_t start = _nameGen->getTemporaryVarArrayIndex(
refOp, getVariableID(
refOp));
266 const Base& value = *
args[
starti].getParameter();
268 if (
args[
i].getParameter() ==
nullptr || *
args[
i].getParameter() != value) {
273 if (
oldArg !=
nullptr &&
oldArg->getParameter() !=
nullptr && *
oldArg->getParameter() == value) {
287 _streamStack << _indentation <<
"for(i = " <<
starti <<
"; i < " <<
i <<
"; i++) "
288 << auxArrayName_ <<
"[i] = " <<
arrayAssign.str() <<
";\n";
302 if (
op.getOperationType() == CGOpCode::ArrayCreation)
303 return _nameGen->generateTemporaryArray(
op);
305 return _nameGen->generateTemporarySparseArray(
op);
310 CPPADCG_ASSERT_KNOWN(
op.getArguments().size() == 2,
"Invalid number of arguments for array element operation")
314 OperationNode<Base>&
arrayOp = *
op.getArguments()[0].getOperation();
316 if (
arrayOp.getOperationType() == CGOpCode::ArrayCreation)
321 _streamStack << "(" <<
arrayName << ")[" <<
op.getInfo()[0] << "]";
331 printArrayStructInit(_ss.str(), *
arrays[
k]);
335inline void LanguageC<Base>::printArrayStructInit(
const std::string&
dataArrayName,
337 const std::string&
aName = createVariableName(array);
347 if (array.getOperationType() == CGOpCode::ArrayCreation) {
348 size_t size = array.getArguments().size();
352 _streamStack << _indentation;
359 _streamStack << _indentation;
367 if (!
changed) _streamStack << _indentation;
373 if (!
changed) _streamStack << _indentation;
374 _streamStack <<
dataArrayName <<
".sparse = " <<
false <<
";";
380 CPPADCG_ASSERT_KNOWN(array.getOperationType() == CGOpCode::SparseArrayCreation,
"Invalid node type")
381 size_t nnz = array.getArguments().size();
382 size_t size = array.getInfo()[0];
386 _streamStack << _indentation;
393 _streamStack << _indentation;
401 if (!
changed) _streamStack << _indentation;
407 if (!
changed) _streamStack << _indentation;
408 _streamStack <<
dataArrayName <<
".sparse = " <<
true <<
"; ";
413 if (!
changed) _streamStack << _indentation;
420 size_t id = getVariableID(array);
422 if (!
changed) _streamStack << _indentation;
423 _streamStack <<
dataArrayName <<
".idx = &(" << _C_SPARSE_INDEX_ARRAY <<
"[" << (
id - 1) <<
"]);";
428 lastArray.idx_id = (std::numeric_limits<size_t>::max)();
435 _streamStack <<
"\n";
440 size_t id = getVariableID(
ty);
441 size_t tySize =
ty.getArguments().size();
443 if (
ty.getOperationType() == CGOpCode::ArrayCreation) {
445 _tmpArrayValues[
id - 1 +
i] =
nullptr;
449 _tmpSparseArrayValues[
id - 1 +
i] =
nullptr;
size_t printArrayCreationUsingLoop(size_t startPos, Node &array, size_t startj, std::vector< const Arg * > &tmpArrayValues)
const std::vector< Argument< Base > > & getArguments() const
CGOpCode getOperationType() const
bool GreaterThanZero(const cg::CG< Base > &x)