1 #ifndef CPPAD_CG_SECTIONED_INDEX_PATTERN_INCLUDED 2 #define CPPAD_CG_SECTIONED_INDEX_PATTERN_INCLUDED 37 inline const std::map<size_t, IndexPattern*>& getLinearSections()
const {
41 inline IndexPatternType getType()
const override {
42 return IndexPatternType::Sectioned;
45 inline void getSubIndexes(std::set<IndexPattern*>& indexes)
const override {
46 for (
const auto& it : sections_) {
47 indexes.insert(it.second);
48 it.second->getSubIndexes(indexes);
53 deleteIndexPatterns(sections_);
60 template<
class VectorSizeT>
61 static inline std::map<size_t, IndexPattern*> detectLinearSections(
const VectorSizeT& indexes,
62 size_t maxCount = 0) {
63 CPPADCG_ASSERT_UNKNOWN(indexes.size() > 0);
69 size_t prevXStart = 0;
73 while (xStart != indexes.size()) {
76 if (xStart + 1 == indexes.size()) {
79 lastLinear = xStart + 1;
81 dy = long(indexes[xStart + 1]) - indexes[xStart];
82 b = long(indexes[xStart]) - dy * xStart;
83 lastLinear = indexes.size();
84 for (
size_t x = xStart + 2; x < indexes.size(); x++) {
85 if (indexes[x] != dy * x + b) {
93 if (dy == 0 && prevPattern !=
nullptr) {
95 while (xStart > 0 && prevPattern->evaluate(xStart - 1) == b) {
98 if (prevXStart + 1 == xStart) {
100 size_t bb = prevPattern->evaluate(prevXStart);
101 prevPattern->setLinearSlopeDy(0);
102 prevPattern->setLinearConstantTerm(bb);
106 linearSections[xStart] = p;
112 if (linearSections.size() == maxCount && xStart != indexes.size()) {
114 return std::map<size_t, IndexPattern*>();
118 return linearSections.release();
121 static inline std::map<size_t, IndexPattern*> detectLinearSections(
const std::map<size_t, size_t>& x2y,
122 size_t maxCount = 0) {
123 using c_iter = std::map<size_t, size_t>::const_iterator;
128 c_iter prevStart = x2y.begin();
130 c_iter pStart = x2y.begin();
131 while (pStart != x2y.end()) {
132 c_iter pNextSection = x2y.end();
136 long xOffset, dy, dx, b;
137 if (p1 == x2y.end()) {
145 long x0 = pStart->first;
146 long y0 = pStart->second;
148 dy = long(p1->second) - y0;
150 dx = long(p1->first) - x0;
153 b = y0 - ((x0 - xOffset) / dx) * dy;
160 for (std::map<size_t, size_t>::const_iterator itp = p1; itp != x2y.end(); ++itp) {
161 size_t x = itp->first;
162 size_t y = itp->second;
164 if (y != ((x - xOffset) / dx) * dy + b) {
172 size_t xStart = pStart->first;
173 if (dy == 0 && prevPattern !=
nullptr) {
176 while (pStart != x2y.begin()) {
177 c_iter prevBack = pStart;
179 if (prevPattern->evaluate(prevBack->first) != b)
184 xStart = pStart->first;
185 c_iter prevStartN = prevStart;
187 if (prevStartN == pStart) {
189 size_t bb = prevPattern->evaluate(prevStart->first);
190 prevPattern->setLinearSlopeDy(0);
191 prevPattern->setLinearConstantTerm(bb);
195 linearSections[xStart] = p;
199 pStart = pNextSection;
201 if (linearSections.size() == maxCount && pStart != x2y.end()) {
203 return std::map<size_t, IndexPattern*>();
207 return linearSections.release();
212 static inline void deleteIndexPatterns(std::map<size_t, IndexPattern*>& sections) {
213 for (
const auto& it : sections) {
std::map< size_t, IndexPattern * > sections_