1 #ifndef CPPAD_CG_LANGUAGE_LATEX_ARRAYS_INCLUDED 2 #define CPPAD_CG_LANGUAGE_LATEX_ARRAYS_INCLUDED 23 void LanguageLatex<Base>::printArrayCreationOp(OperationNode<Base>& array) {
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();
27 const size_t argSize = args.size();
29 size_t startPos =
id - 1;
31 bool firstElement =
true;
32 for (
size_t i = 0; i < argSize; i++) {
33 bool newValue = !isSameArgument(args[i], _tmpArrayValues[startPos + i]);
37 _code << _startAlgLine << _startEq
38 << auxArrayName_ << _assignStr << _nameGen->generateTemporaryArray(array, getVariableID(array))
39 << _endEq << _endAlgLine
40 <<
" % size: " << args.size() << _endline;
45 size_t newI = printArrayCreationUsingLoop(startPos, array, i, _tmpArrayValues);
50 _code << _startAlgLine << _startEq
51 << auxArrayName_ <<
"[" << i <<
"]" << _assignStr;
53 _code << _endEq << _endAlgLine << _endline;
55 _tmpArrayValues[startPos + i] = &args[i];
65 void LanguageLatex<Base>::printSparseArrayCreationOp(OperationNode<Base>& array) {
66 const std::vector<size_t>& info = array.getInfo();
67 CPPADCG_ASSERT_KNOWN(!info.empty(),
"Invalid number of information elements for sparse array creation operation")
69 const std::vector<Argument<Base> >& args = array.getArguments();
70 const size_t argSize = args.size();
72 CPPADCG_ASSERT_KNOWN(info.size() == argSize + 1,
"Invalid number of arguments for sparse array creation operation")
77 const
size_t id = getVariableID(array);
78 size_t startPos =
id - 1;
80 bool firstElement = true;
81 for (
size_t i = 0; i < argSize; i++) {
82 bool newValue = !isSameArgument(args[i], _tmpSparseArrayValues[startPos + i]);
86 _code << _startAlgLine << _startEq
87 << auxArrayName_ << _assignStr << _nameGen->generateTemporarySparseArray(array, getVariableID(array))
88 << _endEq << _endAlgLine
89 <<
" % nnz: " << args.size() <<
" size:" << info[0] << _endline;
94 size_t newI = printArrayCreationUsingLoop(startPos, array, i, _tmpSparseArrayValues);
99 _code << _startAlgLine << _startEq
100 << auxArrayName_ <<
"[" << i <<
"]" << _assignStr;
106 << _C_SPARSE_INDEX_ARRAY <<
"[";
107 if (startPos != 0) _code << startPos <<
"+";
108 _code << i <<
"]" << _assignStr << info[i + 1]
109 << _endEq << _endAlgLine << _endline;
111 _tmpSparseArrayValues[startPos + i] = &args[i];
115 for (
size_t j = i; j < newI; j++) {
116 _code << _startAlgLine << _startEq
117 << _C_SPARSE_INDEX_ARRAY <<
"[";
118 if (startPos != 0) _code << startPos <<
"+";
119 _code << j <<
"]" << _assignStr << info[j + 1]
120 << _endEq << _endAlgLine << _endline;
129 _code << _startAlgLine << _startEq
130 << _C_SPARSE_INDEX_ARRAY <<
"[";
131 if (startPos != 0) _code << startPos <<
"+";
132 _code << i <<
"]" << _assignStr << info[i + 1]
133 << _endEq << _endAlgLine << _endline;
144 const std::vector<Argument<Base> >& args = array.
getArguments();
145 const size_t argSize = args.size();
146 size_t i = starti + 1;
148 std::ostringstream arrayAssign;
151 if (ref.getOperation() !=
nullptr) {
158 for (; i < argSize; i++) {
159 if (isSameArgument(args[i], tmpArrayValues[startPos + i]))
162 if (args[i].getOperation() ==
nullptr ||
163 args[i].getOperation()->getOperationType() != CGOpCode::Inv ||
164 !_nameGen->isConsecutiveInIndepArray(*args[i - 1].getOperation(), getVariableID(*args[i - 1].getOperation()),
165 *args[i].getOperation(), getVariableID(*args[i].getOperation()))) {
174 const std::string& indep = _nameGen->getIndependentArrayName(refOp, getVariableID(refOp));
175 size_t start = _nameGen->getIndependentArrayIndex(refOp, getVariableID(refOp));
176 long offset = long(start) - starti;
178 arrayAssign << indep <<
"[i]";
180 arrayAssign << indep <<
"[" << offset <<
" + i]";
186 size_t pos = refOp.
getInfo()[1];
187 IndexPattern* refIp = _info->loopIndependentIndexPatterns[pos];
188 if (refIp->getType() != IndexPatternType::Linear) {
194 for (; i < argSize; i++) {
195 if (isSameArgument(args[i], tmpArrayValues[startPos + i]))
198 if (args[i].getOperation() ==
nullptr ||
199 args[i].getOperation()->getOperationType() != CGOpCode::LoopIndexedIndep) {
203 if (!_nameGen->isInSameIndependentArray(refOp, getVariableID(refOp),
204 *args[i].getOperation(), getVariableID(*args[i].getOperation())))
207 pos = args[i].getOperation()->getInfo()[1];
208 const IndexPattern* ip = _info->loopIndependentIndexPatterns[pos];
209 if (ip->getType() != IndexPatternType::Linear) {
213 if (refLIp->getLinearSlopeDx() != lIp->getLinearSlopeDx() ||
214 refLIp->getLinearSlopeDy() != lIp->getLinearSlopeDy() ||
215 refLIp->getXOffset() != lIp->getXOffset() ||
216 refLIp->getLinearConstantTerm() - long(starti) != lIp->getLinearConstantTerm() - long(i)) {
225 lip2->setLinearConstantTerm(lip2->getLinearConstantTerm() - starti);
230 op2->getInfo()[1] = (std::numeric_limits<size_t>::max)();
231 op2->getArguments().push_back(_info->auxIterationIndexOp);
233 arrayAssign << _nameGen->generateIndexedIndependent(*op2, 0, p2dip);
243 const Base& value = *args[starti].getParameter();
244 for (; i < argSize; i++) {
245 if (args[i].getParameter() ==
nullptr || *args[i].getParameter() != value) {
250 if (oldArg !=
nullptr && oldArg->getParameter() !=
nullptr && *oldArg->getParameter() == value) {
258 arrayAssign << value;
264 _code << _forStart <<
"{$i \\in \\left[" << starti <<
", " << (i - 1) <<
"\\right]$}" << _endline;
266 _code << _startAlgLine << _startEq
267 << auxArrayName_ <<
"[i]" << _assignStr << arrayAssign.str()
268 << _endEq << _endAlgLine << _endline;
270 _code << _forEnd << _endline;
275 for (
size_t ii = starti; ii < i; ii++) {
276 tmpArrayValues[startPos + ii] = &args[ii];
285 return _nameGen->generateTemporaryArray(op);
287 return _nameGen->generateTemporarySparseArray(op);
292 CPPADCG_ASSERT_KNOWN(op.
getArguments().size() == 2,
"Invalid number of arguments for array element operation")
293 CPPADCG_ASSERT_KNOWN(op.
getArguments()[0].getOperation() !=
nullptr,
"Invalid argument for array element operation")
294 CPPADCG_ASSERT_KNOWN(op.
getInfo().size() == 1,
"Invalid number of information indexes for array element operation")
297 std::string arrayName;
298 if (arrayOp.getOperationType() == CGOpCode::ArrayCreation)
299 arrayName = _nameGen->generateTemporaryArray(arrayOp, getVariableID(arrayOp));
301 arrayName = _nameGen->generateTemporarySparseArray(arrayOp, getVariableID(arrayOp));
303 _code <<
"(" << arrayName <<
")[" << op.
getInfo()[0] <<
"]";
312 _ss << dataArrayName <<
"[" << pos <<
"]";
313 printArrayStructInit(_ss.str(), *arrays[k]);
322 const std::string& aName = createVariableName(array);
328 _code << dataArrayName <<
".data = " << aName <<
"; ";
330 _code << dataArrayName <<
".data = NULL; ";
331 _code << dataArrayName <<
".size = " << size <<
"; " 332 << dataArrayName <<
".sparse = " <<
false <<
";";
335 CPPADCG_ASSERT_KNOWN(array.
getOperationType() == CGOpCode::SparseArrayCreation,
"Invalid node type")
338 _code << dataArrayName <<
".data = " << aName <<
"; ";
340 _code << dataArrayName <<
".data = NULL; ";
341 _code << dataArrayName <<
".size = " << array.
getInfo()[0] <<
"; " 342 << dataArrayName <<
".sparse = " <<
true <<
"; " 343 << dataArrayName <<
".nnz = " << nnz <<
"; ";
345 size_t id = getVariableID(array);
346 _code << dataArrayName <<
".idx = &(" << _C_SPARSE_INDEX_ARRAY <<
"[" << (
id - 1) <<
"]);";
354 size_t id = getVariableID(ty);
358 for (
size_t i = 0; i < tySize; i++) {
359 _tmpArrayValues[
id - 1 + i] =
nullptr;
362 for (
size_t i = 0; i < tySize; i++) {
363 _tmpSparseArrayValues[
id - 1 + i] =
nullptr;
const std::vector< Argument< Base > > & getArguments() const
CGOpCode getOperationType() const
size_t printArrayCreationUsingLoop(size_t startPos, Node &array, size_t startj, std::vector< const Arg *> &tmpArrayValues)
const std::vector< size_t > & getInfo() const