CppADCodeGen 2.4.3
A C++ Algorithmic Differentiation Package with Source Code Generation
Loading...
Searching...
No Matches
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
19namespace CppAD {
20namespace cg {
21
26private:
27 bool filterDefined_;
29 std::vector<std::vector<bool> > elFilter_;
30 bool fullDefined_;
31 std::vector<std::set<size_t> > elements_;
32public:
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