1#ifndef CPPAD_CG_LANGUAGE_LATEX_ARRAYS_INCLUDED
2#define CPPAD_CG_LANGUAGE_LATEX_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 _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;
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();
77 const size_t id = getVariableID(array);
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 <<
"[";
108 _code <<
i <<
"]" << _assignStr <<
info[
i + 1]
109 << _endEq << _endAlgLine << _endline;
116 _code << _startAlgLine << _startEq
117 << _C_SPARSE_INDEX_ARRAY <<
"[";
119 _code <<
j <<
"]" << _assignStr <<
info[
j + 1]
120 << _endEq << _endAlgLine << _endline;
129 _code << _startAlgLine << _startEq
130 << _C_SPARSE_INDEX_ARRAY <<
"[";
132 _code <<
i <<
"]" << _assignStr <<
info[
i + 1]
133 << _endEq << _endAlgLine << _endline;
151 if (
ref.getOperation() !=
nullptr) {
154 if (
refOp.getOperationType() == CGOpCode::Inv) {
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));
182 }
else if (
refOp.getOperationType() == CGOpCode::LoopIndexedIndep) {
188 if (
refIp->getType() != IndexPatternType::Linear) {
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];
209 if (
ip->getType() != IndexPatternType::Linear) {
213 if (
refLIp->getLinearSlopeDx() !=
lIp->getLinearSlopeDx() ||
214 refLIp->getLinearSlopeDy() !=
lIp->getLinearSlopeDy() ||
215 refLIp->getXOffset() !=
lIp->getXOffset() ||
225 lip2->setLinearConstantTerm(
lip2->getLinearConstantTerm() -
starti);
230 op2->getInfo()[1] = (std::numeric_limits<size_t>::max)();
231 op2->getArguments().push_back(_info->auxIterationIndexOp);
243 const Base& value = *
args[
starti].getParameter();
245 if (
args[
i].getParameter() ==
nullptr || *
args[
i].getParameter() != value) {
250 if (
oldArg !=
nullptr &&
oldArg->getParameter() !=
nullptr && *
oldArg->getParameter() == 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;
284 if (
op.getOperationType() == CGOpCode::ArrayCreation)
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")
296 OperationNode<Base>&
arrayOp = *
op.getArguments()[0].getOperation();
298 if (
arrayOp.getOperationType() == CGOpCode::ArrayCreation)
303 _code << "(" <<
arrayName << ")[" <<
op.getInfo()[0] << "]";
313 printArrayStructInit(_ss.str(), *
arrays[
k]);
322 const std::string&
aName = createVariableName(array);
335 CPPADCG_ASSERT_KNOWN(array.
getOperationType() == CGOpCode::SparseArrayCreation,
"Invalid node type")
345 size_t id = getVariableID(array);
346 _code <<
dataArrayName <<
".idx = &(" << _C_SPARSE_INDEX_ARRAY <<
"[" << (
id - 1) <<
"]);";
354 size_t id = getVariableID(
ty);
355 size_t tySize =
ty.getArguments().size();
357 if (
ty.getOperationType() == CGOpCode::ArrayCreation) {
359 _tmpArrayValues[
id - 1 +
i] =
nullptr;
363 _tmpSparseArrayValues[
id - 1 +
i] =
nullptr;
size_t printArrayCreationUsingLoop(size_t startPos, Node &array, size_t startj, std::vector< const Arg * > &tmpArrayValues)
const std::vector< size_t > & getInfo() const
const std::vector< Argument< Base > > & getArguments() const
CGOpCode getOperationType() const
bool GreaterThanZero(const cg::CG< Base > &x)