127 size_t iterationCount,
128 const std::vector<std::vector<size_t> >& dependentOrigIndexes,
129 const std::vector<std::vector<size_t> >& indexedIndepOrigIndexes,
130 const std::vector<size_t>& nonIndexedIndepOrigIndexes,
131 const std::vector<size_t>& temporaryIndependents) :
132 loopId_(createNewLoopId()),
134 containsAtoms_(containsAtoms),
135 iterationCount_(iterationCount),
136 m_(dependentOrigIndexes.size()),
138 indexedIndepIndexes_(indexedIndepOrigIndexes.size(), std::
vector<
LoopPosition>(iterationCount)),
139 nonIndexedIndepIndexes_(nonIndexedIndepOrigIndexes.size()),
140 temporaryIndependents_(temporaryIndependents.size()),
141 iteration2orig2indexedIndepIndexes_(iterationCount),
143 hessSparsity_(false) {
144 CPPADCG_ASSERT_KNOWN(fun !=
nullptr,
"fun cannot be null");
149 for (
size_t i = 0; i < m_; i++) {
150 for (
size_t it = 0; it < iterationCount_; it++) {
151 size_t orig = dependentOrigIndexes[i][it];
153 if (orig != (std::numeric_limits<size_t>::max)())
155 dependentIndexes_[i][it].original,
165 size_t lm = dependentIndexes_.size();
167 for (
size_t i = 0; i < lm; i++) {
168 std::set<size_t> iterations;
169 for (
size_t it = 0; it < iterationCount_; it++) {
170 if (dependentIndexes_[i][it].original != (std::numeric_limits<size_t>::max)()) {
171 iterations.insert(it);
174 iterations2equations[iterations].insert(i);
177 equationGroups_.resize(iterations2equations.size());
178 iteration2eqGroups_.resize(iterationCount_);
182 for (itEqeIt = iterations2equations.begin(); itEqeIt != iterations2equations.end(); ++itEqeIt, g++) {
183 const std::set<size_t>& iterations = itEqeIt->first;
187 group.
tapeI = itEqeIt->second;
192 for (
size_t itIt : iterations) {
193 iteration2eqGroups_[itIt].insert(&group);
200 size_t nIndexed = indexedIndepOrigIndexes.size();
203 for (
size_t it = 0; it < iterationCount_; it++) {
204 for (
size_t j = 0; j < nIndexed; j++) {
205 size_t orig = indexedIndepOrigIndexes[j][it];
207 if (orig != (std::numeric_limits<size_t>::max)())
208 iteration2orig2indexedIndepIndexes_[it][orig].insert(j);
213 size_t nNonIndexed = nonIndexedIndepOrigIndexes.size();
214 for (
size_t j = 0; j < nNonIndexed; j++) {
215 size_t orig = nonIndexedIndepOrigIndexes[j];
216 nonIndexedIndepIndexes_[j] =
LoopPosition(nIndexed + j, orig);
217 orig2nonIndexedIndepIndexes_[orig] = &nonIndexedIndepIndexes_[j];
221 for (
size_t j = 0; j < temporaryIndependents.size(); j++) {
222 size_t k = temporaryIndependents[j];
223 temporaryIndependents_[j] =
LoopPosition(nIndexed + nNonIndexed + j, k);
224 orig2tempIndepIndexes_[k] = &temporaryIndependents_[j];