1#ifndef CPPAD_CG_LANGUAGE_MATHML_ARRAYS_INCLUDED
2#define CPPAD_CG_LANGUAGE_MATHML_ARRAYS_INCLUDED
23 CPPADCG_ASSERT_KNOWN(array.getArguments().size() > 0,
"Invalid number of arguments for array creation operation")
24 const size_t id = getVariableID(array);
25 const std::vector<Argument<Base> >&
args = array.getArguments();
37 <<
"<mrow class='tmp'>" << auxArrayName_ <<
"</mrow>" << _assignStr << _nameGen->generateTemporaryArray(array, getVariableID(array))
39 <<
" <!-- size: " <<
args.size() <<
" -->" << _endline;
44 size_t newI = printArrayCreationUsingLoop(
startPos, array,
i, _tmpArrayValues);
50 <<
"<mrow class='tmp'>" << auxArrayName_ <<
"</mrow><mfenced open='[' close=']'><mn>" <<
i <<
"</mn></mfenced>" << _assignStr;
52 _code << _endEq << _endline;
65 const std::vector<size_t>&
info = array.getInfo();
66 CPPADCG_ASSERT_KNOWN(!
info.empty(),
"Invalid number of information elements for sparse array creation operation")
68 const std::vector<Argument<Base> >&
args = array.getArguments();
76 const size_t id = getVariableID(array);
86 <<
"<mrow class='tmp'>" << auxArrayName_ <<
"</mrow>" << _assignStr << _nameGen->generateTemporarySparseArray(array, getVariableID(array))
88 <<
" <!-- nnz: " <<
args.size() <<
" size:" <<
info[0] <<
" -->" << _endline;
93 size_t newI = printArrayCreationUsingLoop(
startPos, array,
i, _tmpSparseArrayValues);
99 <<
"<mrow class='tmp'>" << auxArrayName_ <<
"</mrow><mfenced open='[' close=']'><mn>" <<
i <<
"</mn></mfenced>" << _assignStr;
105 <<
"<mi>" << _C_SPARSE_INDEX_ARRAY <<
"</mi><mfenced open='[' close=']'><mrow>";
107 _code <<
"<mn>" <<
i <<
"</mn></mrow></mfenced>" << _assignStr <<
"<mn>" <<
info[
i + 1] <<
"</mn>"
108 << _endEq << _endline;
116 <<
"<mi>" << _C_SPARSE_INDEX_ARRAY <<
"</mi><mfenced open='[' close=']'><mrow>";
118 _code <<
"<mn>" <<
j <<
"</mn></mrow></mfenced>" << _assignStr <<
"<mn>" <<
info[
j + 1] <<
"</mn>"
119 << _endEq << _endline;
129 <<
"<mi>" << _C_SPARSE_INDEX_ARRAY <<
"</mi><mfenced open='[' close=']'><mrow>";
131 _code <<
"<mn>" <<
i <<
"</mn></mrow></mfenced>" << _assignStr <<
"<mn>" <<
info[
i + 1] <<
"</mn>"
132 << _endEq << _endline;
150 if (
ref.getOperation() !=
nullptr) {
153 if (
refOp.getOperationType() == CGOpCode::Inv) {
161 if (
args[
i].getOperation() ==
nullptr ||
162 args[
i].getOperation()->getOperationType() != CGOpCode::Inv ||
163 !_nameGen->isConsecutiveInIndepArray(*
args[
i - 1].getOperation(), getVariableID(*
args[
i - 1].getOperation()),
164 *
args[
i].getOperation(), getVariableID(*
args[
i].getOperation()))) {
173 const std::string&
indep = _nameGen->getIndependentArrayName(
refOp, getVariableID(
refOp));
174 size_t start = _nameGen->getIndependentArrayIndex(
refOp, getVariableID(
refOp));
177 arrayAssign <<
"<mrow class='indep'>" <<
indep <<
"</mrow>" <<
"<mfenced open='[' close=']'><mi>i</mi></mfenced>";
179 arrayAssign <<
"<mrow class='indep'>" <<
indep <<
"</mrow>" <<
"<mfenced open='[' close=']'><mrow><mn>" <<
offset <<
"</mn> <mo>+</mo> <mi>i</mi></mrow></mfenced>";
181 }
else if (
refOp.getOperationType() == CGOpCode::LoopIndexedIndep) {
187 if (
refIp->getType() != IndexPatternType::Linear) {
197 if (
args[
i].getOperation() ==
nullptr ||
198 args[
i].getOperation()->getOperationType() != CGOpCode::LoopIndexedIndep) {
202 if (!_nameGen->isInSameIndependentArray(
refOp, getVariableID(
refOp),
203 *
args[
i].getOperation(), getVariableID(*
args[
i].getOperation())))
206 pos =
args[
i].getOperation()->getInfo()[1];
208 if (
ip->getType() != IndexPatternType::Linear) {
212 if (
refLIp->getLinearSlopeDx() !=
lIp->getLinearSlopeDx() ||
213 refLIp->getLinearSlopeDy() !=
lIp->getLinearSlopeDy() ||
214 refLIp->getXOffset() !=
lIp->getXOffset() ||
224 lip2->setLinearConstantTerm(
lip2->getLinearConstantTerm() -
starti);
229 op2->getInfo()[1] = (std::numeric_limits<size_t>::max)();
230 op2->getArguments().push_back(_info->auxIterationIndexOp);
242 const Base& value = *
args[
starti].getParameter();
244 if (
args[
i].getParameter() ==
nullptr || *
args[
i].getParameter() != value) {
249 if (
oldArg !=
nullptr &&
oldArg->getParameter() !=
nullptr && *
oldArg->getParameter() == value) {
263 _code << _forStart << _startEq <<
"<mi>for</mi>"
264 "<mfenced><mrow><mi>i</mi><mo>∈</mo>"
265 "<mfenced open='[' close=']' separators=';'>"
266 "<mn>" <<
starti <<
"</mn><mn>" <<
i <<
"</mn>"
268 "</mrow></mfenced>" << _endEq << _endline
272 <<
"<mrow class='tmp'>" << auxArrayName_ <<
"</mrow><mfenced open='[' close=']'><mi>i</mi></mfenced>" << _assignStr <<
arrayAssign.str()
273 << _endEq << _endline;
275 _code << _forBodyEnd << _endline << _forEnd << _endline;
289 if (
op.getOperationType() == CGOpCode::ArrayCreation)
290 return _nameGen->generateTemporaryArray(
op);
292 return _nameGen->generateTemporarySparseArray(
op);
297 CPPADCG_ASSERT_KNOWN(
op.getArguments().size() == 2,
"Invalid number of arguments for array element operation")
301 OperationNode<Base>&
arrayOp = *
op.getArguments()[0].getOperation();
303 if (
arrayOp.getOperationType() == CGOpCode::ArrayCreation)
317 _ss <<
"<mrow class='tmp'>" <<
dataArrayName <<
"</mrow><mfenced open='[' close=']'><mn>" <<
pos <<
"</mn></mfenced>";
318 printArrayStructInit(_ss.str(), *
arrays[
k]);
327 const std::string&
aName = createVariableName(array);
335 _code <<
dataArrayName <<
"<mo>.</mo><mi>data</mi><mo>=</mo>NULL";
336 _code <<
dataArrayName <<
"<mo>.</mo><mi>size</mi><mo>=</mo><mn>" << size <<
"</mn>"
337 <<
dataArrayName <<
"<mo>.</mo><mi>sparse</mi><mo>=</mo><mn>" <<
false <<
"</mn>";
340 CPPADCG_ASSERT_KNOWN(array.
getOperationType() == CGOpCode::SparseArrayCreation,
"Invalid node type")
345 _code <<
dataArrayName <<
"<mo>.</mo><mi>data</mi><mo>=</mo>NULL";
346 _code <<
dataArrayName <<
"<mo>.</mo><mi>size</mi><mo>=</mo><mn>" << array.
getInfo()[0] <<
"</mn>"
347 <<
dataArrayName <<
"<mo>.</mo><mi>sparse</mi><mo>=</mo><mn>" <<
true <<
"</mn>"
348 <<
dataArrayName <<
"<mo>.</mo><mi>nnz</mi><mo>=</mo><mn>" << nnz <<
"</mn>";
350 size_t id = getVariableID(array);
351 _code <<
dataArrayName <<
"<mo>.</mo><mi>idx</mi><mo>=</mo>&<mo>(</mo><mi>" << _C_SPARSE_INDEX_ARRAY <<
"</mi><mfenced open='[' close=']'><mn>" << (
id - 1) <<
"</mn></mfenced><mo>)</mo>";
359 size_t id = getVariableID(
ty);
360 size_t tySize =
ty.getArguments().size();
362 if (
ty.getOperationType() == CGOpCode::ArrayCreation) {
364 _tmpArrayValues[
id - 1 +
i] =
nullptr;
368 _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)