1 #ifndef CPPAD_CG_LANGUAGE_MATHML_ARRAYS_INCLUDED 2 #define CPPAD_CG_LANGUAGE_MATHML_ARRAYS_INCLUDED 22 void LanguageMathML<Base>::printArrayCreationOp(OperationNode<Base>& array) {
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();
26 const size_t argSize = args.size();
28 size_t startPos =
id - 1;
30 bool firstElement =
true;
31 for (
size_t i = 0; i < argSize; i++) {
32 bool newValue = !isSameArgument(args[i], _tmpArrayValues[startPos + i]);
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;
54 _tmpArrayValues[startPos + i] = &args[i];
64 void LanguageMathML<Base>::printSparseArrayCreationOp(OperationNode<Base>& array) {
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();
69 const size_t argSize = args.size();
71 CPPADCG_ASSERT_KNOWN(info.size() == argSize + 1,
"Invalid number of arguments for sparse array creation operation")
76 const
size_t id = getVariableID(array);
77 size_t startPos =
id - 1;
79 bool firstElement = true;
80 for (
size_t i = 0; i < argSize; i++) {
81 bool newValue = !isSameArgument(args[i], _tmpSparseArrayValues[startPos + i]);
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>";
106 if (startPos != 0) _code <<
"<mn>" << startPos <<
"</mn><mo>+</mo>";
107 _code <<
"<mn>" << i <<
"</mn></mrow></mfenced>" << _assignStr <<
"<mn>" << info[i + 1] <<
"</mn>" 108 << _endEq << _endline;
110 _tmpSparseArrayValues[startPos + i] = &args[i];
114 for (
size_t j = i; j < newI; j++) {
116 <<
"<mi>" << _C_SPARSE_INDEX_ARRAY <<
"</mi><mfenced open='[' close=']'><mrow>";
117 if (startPos != 0) _code <<
"<mn>" << startPos <<
"</mn><mo>+</mo>";
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>";
130 if (startPos != 0) _code <<
"<mn>" << startPos <<
"</mn><mo>+</mo>";
131 _code <<
"<mn>" << i <<
"</mn></mrow></mfenced>" << _assignStr <<
"<mn>" << info[i + 1] <<
"</mn>" 132 << _endEq << _endline;
143 const std::vector<Argument<Base> >& args = array.
getArguments();
144 const size_t argSize = args.size();
145 size_t i = starti + 1;
147 std::ostringstream arrayAssign;
150 if (ref.getOperation() !=
nullptr) {
157 for (; i < argSize; i++) {
158 if (isSameArgument(args[i], tmpArrayValues[startPos + i]))
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));
175 long offset = long(start) - starti;
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>";
185 size_t pos = refOp.
getInfo()[1];
186 IndexPattern* refIp = _info->loopIndependentIndexPatterns[pos];
187 if (refIp->getType() != IndexPatternType::Linear) {
193 for (; i < argSize; i++) {
194 if (isSameArgument(args[i], tmpArrayValues[startPos + i]))
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];
207 const IndexPattern* ip = _info->loopIndependentIndexPatterns[pos];
208 if (ip->getType() != IndexPatternType::Linear) {
212 if (refLIp->getLinearSlopeDx() != lIp->getLinearSlopeDx() ||
213 refLIp->getLinearSlopeDy() != lIp->getLinearSlopeDy() ||
214 refLIp->getXOffset() != lIp->getXOffset() ||
215 refLIp->getLinearConstantTerm() - long(starti) != lIp->getLinearConstantTerm() - long(i)) {
224 lip2->setLinearConstantTerm(lip2->getLinearConstantTerm() - starti);
229 op2->getInfo()[1] = (std::numeric_limits<size_t>::max)();
230 op2->getArguments().push_back(_info->auxIterationIndexOp);
232 arrayAssign << _nameGen->generateIndexedIndependent(*op2, 0, p2dip);
242 const Base& value = *args[starti].getParameter();
243 for (; i < argSize; i++) {
244 if (args[i].getParameter() ==
nullptr || *args[i].getParameter() != value) {
249 if (oldArg !=
nullptr && oldArg->getParameter() !=
nullptr && *oldArg->getParameter() == value) {
257 arrayAssign << 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;
280 for (
size_t ii = starti; ii < i; ii++) {
281 tmpArrayValues[startPos + ii] = &args[ii];
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")
298 CPPADCG_ASSERT_KNOWN(op.
getArguments()[0].getOperation() !=
nullptr,
"Invalid argument for array element operation")
299 CPPADCG_ASSERT_KNOWN(op.
getInfo().size() == 1,
"Invalid number of information indexes for array element operation")
302 std::string arrayName;
303 if (arrayOp.getOperationType() == CGOpCode::ArrayCreation)
304 arrayName = _nameGen->generateTemporaryArray(arrayOp, getVariableID(arrayOp));
306 arrayName = _nameGen->generateTemporarySparseArray(arrayOp, getVariableID(arrayOp));
308 _code <<
"<mo>(</mo><mrow class='tmp'>" << arrayName <<
"</mrow><mo>)</mo><mfenced open='[' close=']'><mn>" << op.
getInfo()[0] <<
"</mn></mfenced>";
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);
333 _code << dataArrayName <<
"<mo>.</mo><mi>data</mi><mo>=</mo>" << aName;
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")
343 _code << dataArrayName <<
"<mo>.</mo><mi>data</mi><mo>=</mo>" << aName;
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);
363 for (
size_t i = 0; i < tySize; i++) {
364 _tmpArrayValues[
id - 1 + i] =
nullptr;
367 for (
size_t i = 0; i < tySize; i++) {
368 _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