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