1 #ifndef CPPAD_CG_ITER_EQUATION_GROUP_INCLUDED 2 #define CPPAD_CG_ITER_EQUATION_GROUP_INCLUDED 29 using pairss = std::pair<size_t, size_t>;
31 static const std::vector<std::set<pairss> > EMPTYVECTORSETSS;
32 static const std::vector<std::set<size_t> > EMPTYVECTORSETS;
33 static const std::map<size_t, std::set<size_t> > EMPTYMAPSETS;
47 std::vector<std::set<size_t> > hessTapeSparsity_;
53 std::map<pairss, std::vector<std::set<pairss> > > hessOrig2Iter2TapeJ1TapeJ2_;
58 std::map<pairss, std::vector<std::set<size_t> > > hessOrig2Iter2TapeJ1OrigJ2_;
63 std::map<pairss, std::vector<std::set<size_t> > > hessOrig2Iter2OrigJ1TapeJ2_;
68 std::set<pairss> hessOrigJ1OrigJ2_;
73 std::map<pairss, std::map<size_t, std::set<size_t> > > hessOrig2TempTapeJ22Iter_;
77 index((
std::numeric_limits<size_t>::max)()),
79 hessSparsity_(false) {
87 CPPADCG_ASSERT_UNKNOWN(model !=
nullptr);
96 hessTapeSparsity_ = hessianSparsitySet<std::vector<std::set<size_t> >,
CGB>(fun,
tapeI);
101 size_t nIndexed = indexedIndepIndexes.size();
102 size_t nNonIndexed = nonIndexedIndepIndexes.size();
103 size_t nTemp = temporaryIndependents.size();
105 for (
size_t iter : iterations) {
109 for (
size_t tapeJ1 = 0; tapeJ1 < nIndexed; tapeJ1++) {
110 const std::set<size_t>& hessRow = hessTapeSparsity_[tapeJ1];
111 size_t j1 = indexedIndepIndexes[tapeJ1][iter].original;
113 std::set<size_t> ::const_iterator itTape2;
114 for (itTape2 = hessRow.begin(); itTape2 != hessRow.end() && *itTape2 < nIndexed; ++itTape2) {
115 size_t j2 = indexedIndepIndexes[*itTape2][iter].original;
117 pairss tapeTape(tapeJ1, *itTape2);
118 std::vector<std::set<pairss> >& iterations = hessOrig2Iter2TapeJ1TapeJ2_[orig];
119 iterations.resize(iterationCount);
120 iterations[iter].insert(tapeTape);
123 for (; itTape2 != hessRow.end() && *itTape2 < nIndexed + nNonIndexed; ++itTape2) {
124 size_t j2 = nonIndexedIndepIndexes[*itTape2 - nIndexed].original;
126 std::vector<std::set<size_t> >& iterations = hessOrig2Iter2TapeJ1OrigJ2_[orig];
127 iterations.resize(iterationCount);
128 iterations[iter].insert(tapeJ1);
135 for (
size_t tapeJ1 = nIndexed; tapeJ1 < nIndexed + nNonIndexed; tapeJ1++) {
136 const std::set<size_t>& hessRow = hessTapeSparsity_[tapeJ1];
137 size_t j1 = nonIndexedIndepIndexes[tapeJ1 - nIndexed].original;
139 std::set<size_t> ::const_iterator itTape2;
140 for (itTape2 = hessRow.begin(); itTape2 != hessRow.end() && *itTape2 < nIndexed; ++itTape2) {
141 size_t j2 = indexedIndepIndexes[*itTape2][iter].original;
143 std::vector<std::set<size_t> >& iterations = hessOrig2Iter2OrigJ1TapeJ2_[orig];
144 iterations.resize(iterationCount);
145 iterations[iter].insert(*itTape2);
148 for (; itTape2 != hessRow.end() && *itTape2 < nIndexed + nNonIndexed; ++itTape2) {
149 size_t j2 = nonIndexedIndepIndexes[*itTape2 - nIndexed].original;
151 hessOrigJ1OrigJ2_.insert(orig);
158 for (
size_t tapeJ1 = nIndexed + nNonIndexed; tapeJ1 < nIndexed + nNonIndexed + nTemp; tapeJ1++) {
159 const std::set<size_t>& hessRow = hessTapeSparsity_[tapeJ1];
160 size_t k1 = temporaryIndependents[tapeJ1 - nIndexed - nNonIndexed].original;
162 std::set<size_t> ::const_iterator itTape2;
163 for (itTape2 = hessRow.begin(); itTape2 != hessRow.end() && *itTape2 < nIndexed; ++itTape2) {
164 size_t j2 = indexedIndepIndexes[*itTape2][iter].original;
166 std::map<size_t, std::set<size_t> >& var2iters = hessOrig2TempTapeJ22Iter_[pos];
167 var2iters[*itTape2].insert(iter);
173 hessSparsity_ =
true;
177 inline const std::vector<std::set<size_t> >& getHessianSparsity()
const {
178 return hessTapeSparsity_;
189 size_t origJ2)
const {
190 pairss orig(origJ1, origJ2);
192 std::map<pairss, std::vector<std::set<pairss> > >::const_iterator it;
193 it = hessOrig2Iter2TapeJ1TapeJ2_.find(orig);
194 if (it != hessOrig2Iter2TapeJ1TapeJ2_.end()) {
197 return EMPTYVECTORSETSS;
201 inline const std::vector<std::set<size_t> >& getHessianIndexedNonIndexedTapeIndexes(
size_t origJ1,
202 size_t origJ2)
const {
203 pairss orig(origJ1, origJ2);
205 std::map<pairss, std::vector<std::set<size_t> > > ::const_iterator it;
206 it = hessOrig2Iter2TapeJ1OrigJ2_.find(orig);
207 if (it != hessOrig2Iter2TapeJ1OrigJ2_.end()) {
210 return EMPTYVECTORSETS;
214 inline const std::vector<std::set<size_t> >& getHessianNonIndexedIndexedTapeIndexes(
size_t origJ1,
215 size_t origJ2)
const {
216 pairss orig(origJ1, origJ2);
218 std::map<pairss, std::vector<std::set<size_t> > >::const_iterator it;
219 it = hessOrig2Iter2OrigJ1TapeJ2_.find(orig);
220 if (it != hessOrig2Iter2OrigJ1TapeJ2_.end()) {
223 return EMPTYVECTORSETS;
227 inline const std::set<std::pair<size_t, size_t> >& getHessianNonIndexedNonIndexedIndexes()
const {
228 return hessOrigJ1OrigJ2_;
231 inline const std::map<size_t, std::set<size_t> >& getHessianTempIndexedTapeIndexes(
size_t k1,
232 size_t origJ2)
const {
233 pairss pos(k1, origJ2);
235 std::map<pairss, std::map<size_t, std::set<size_t> > >::const_iterator it;
236 it = hessOrig2TempTapeJ22Iter_.find(pos);
237 if (it != hessOrig2TempTapeJ22Iter_.end()) {
const std::vector< LoopPosition > & getTemporaryIndependents() const
size_t index
iteration group index/ID
const std::vector< std::set< pairss > > & getHessianIndexedIndexedTapeIndexes(size_t origJ1, size_t origJ2) const
ADFun< CGB > & getTape() const
const std::vector< LoopPosition > & getNonIndexedIndepIndexes() const
const size_t getIterationCount() const
void evalHessianSparsity()
const std::vector< std::vector< LoopPosition > > & getIndexedIndepIndexes() const
std::set< size_t > tapeI
equations indexes in tape of the loop model
std::set< size_t > iterations
iterations which only have these equations defined