CppADCodeGen  HEAD
A C++ Algorithmic Differentiation Package with Source Code Generation
custom_position.hpp
1 #ifndef CPPAD_CG_CUSTOM_POSITION_INCLUDED
2 #define CPPAD_CG_CUSTOM_POSITION_INCLUDED
3 /* --------------------------------------------------------------------------
4  * CppADCodeGen: C++ Algorithmic Differentiation with Source Code Generation:
5  * Copyright (C) 2013 Ciengis
6  * Copyright (C) 2020 Joao Leal
7  *
8  * CppADCodeGen is distributed under multiple licenses:
9  *
10  * - Eclipse Public License Version 1.0 (EPL1), and
11  * - GNU General Public License Version 3 (GPL3).
12  *
13  * EPL1 terms and conditions can be found in the file "epl-v10.txt", while
14  * terms and conditions for the GPL3 can be found in the file "gpl3.txt".
15  * ----------------------------------------------------------------------------
16  * Author: Joao Leal
17  */
18 
19 namespace CppAD {
20 namespace cg {
21 
26 private:
27  bool filterDefined_;
29  std::vector<std::vector<bool> > elFilter_;
30  bool fullDefined_;
31  std::vector<std::set<size_t> > elements_;
32 public:
33 
34  inline CustomPosition() :
35  filterDefined_(false),
36  fullDefined_(false) {
37  }
38 
39  template<class VectorSize>
40  inline CustomPosition(size_t m, size_t n,
41  const VectorSize& rows,
42  const VectorSize& cols) :
43  filterDefined_(true),
44  elFilter_(m, std::vector<bool>(n, false)),
45  fullDefined_(false) {
46  CPPADCG_ASSERT_KNOWN(rows.size() == cols.size(), "The number of row indexes must be the same as the number of column indexes.")
47  for (size_t i = 0; i < rows.size(); i++) {
48  elFilter_[rows[i]][cols[i]] = true;
49  }
50  }
51 
52  template<class VectorSet>
53  inline CustomPosition(size_t m, size_t n,
54  const VectorSet& elements) :
55  filterDefined_(true),
56  elFilter_(m, std::vector<bool>(n, false)),
57  fullDefined_(false) {
58  CPPADCG_ASSERT_KNOWN(elements.size() <= m, "Invalid number of rows.")
59 
60  for (size_t i = 0; i < elements.size(); i++) {
61  for (size_t it : elements[i]) {
62  elFilter_[i][it] = true;
63  }
64  }
65  }
66 
67  inline bool isFilterDefined() const {
68  return filterDefined_;
69  }
70 
71  inline bool isFullDefined() const {
72  return fullDefined_;
73  }
74 
75  inline void setFullElements(const std::vector<std::set<size_t> >& elements) {
76  elements_ = elements;
77  filter(elements_);
78  fullDefined_ = true;
79  }
80 
81  inline const std::vector<std::set<size_t> >& getFullElements()const {
82  return elements_;
83  }
84 
85  inline void filter(CppAD::vector<std::set<size_t> >& sparsity) const {
86  ArrayView<std::set<size_t> > s(sparsity);
87  filter(s);
88  }
89 
90  inline void filter(std::vector<std::set<size_t> >& sparsity) const {
91  ArrayView<std::set<size_t> > s(sparsity);
92  filter(s);
93  }
94 
95  inline void filter(ArrayView<std::set<size_t> >& sparsity) const {
96  if (!filterDefined_)
97  return; // nothing to do
98 
99  std::set<size_t>::iterator it, currentIt;
100 
101  for (size_t i = 0; i < sparsity.size(); i++) {
102  it = sparsity[i].begin();
103  while (it != sparsity[i].end()) {
104  // copy the current iterator then increment it
105  currentIt = it++;
106  if (!elFilter_[i][*currentIt]) {
107  sparsity[i].erase(currentIt); // not in allowed elements
108  }
109  }
110  }
111  }
112 
113 };
114 
115 } // END cg namespace
116 } // END CppAD namespace
117 
118 #endif