PANOC-ALM  quadratic-penalty
Nonconvex constrained optimization
alloc.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 
5 #include <algorithm>
6 #include <cassert>
7 #include <stack>
8 #include <utility>
9 #include <vector>
10 
11 namespace pa {
12 
14  private:
15  size_t num_vec;
16  Eigen::Index n;
17  std::vector<real_t> storage;
18  struct findstack : std::stack<real_t *, std::vector<real_t *>> {
19  using stack::stack;
20 
21  auto begin() { return this->c.begin(); }
22  auto begin() const { return this->c.begin(); }
23  auto end() { return this->c.end(); }
24  auto end() const { return this->c.end(); }
25 
26  auto cbegin() const { return this->c.cbegin(); }
27  auto cend() const { return this->c.cend(); }
28 
29  auto rbegin() { return this->c.rbegin(); }
30  auto rbegin() const { return this->c.rbegin(); }
31  auto rend() { return this->c.rend(); }
32  auto rend() const { return this->c.rend(); }
33 
34  auto crbegin() const { return this->c.crbegin(); }
35  auto crend() const { return this->c.crend(); }
36  } stack;
37  size_t highwatermark = 0;
38 
39  public:
40  vec_allocator(size_t num_vec, Eigen::Index n)
41  : num_vec(num_vec), n(n), storage(num_vec * n, NaN) {
42  for (auto it = storage.begin(); it < storage.end(); it += n)
43  stack.push(&*it);
44  }
45 
46  vec_allocator(const vec_allocator &) = delete;
50 
52  using mvec = Eigen::Map<vec>;
55 
57  : v{dptr, n}, alloc{alloc} {}
59  : v{std::move(v)}, alloc{alloc} {}
61  assert(alloc);
62  alloc->free(v);
63  }
66  : v{std::exchange(o.v, {nullptr, 0})}, //
67  alloc{std::exchange(o.alloc, nullptr)} {}
70  this->v = std::exchange(o.v, {nullptr, 0});
71  this->alloc = std::exchange(o.alloc, nullptr);
72  return *this;
73  }
74 
76  this->v = v;
77  return *this;
78  }
79  operator crvec() const { return v; }
80  operator rvec() { return v; }
81  };
82 
83  auto alloc() {
84  if (stack.empty())
85  throw std::bad_alloc();
86  auto dptr = stack.top();
87  stack.pop();
88  highwatermark = std::max(used_space(), highwatermark);
89  return Eigen::Map<vec>(dptr, n);
90  }
91 
92  alloc_raii_wrapper alloc_raii() { return {alloc(), this}; }
93 
94  void free(rvec v) {
95  auto dptr = v.data();
96  assert(dptr >= &*storage.begin());
97  assert(dptr <= &*storage.end() - n);
98  assert(std::find(stack.begin(), stack.end(), dptr) == stack.end() &&
99  "double free");
100  stack.push(dptr);
101  }
102 
103  template <class... Vecs>
104  void free(rvec first, Vecs &&...vecs) {
105  free(first);
106  free(vecs...);
107  }
108 
109  size_t size() const { return stack.size(); }
110  size_t used_space() const { return num_vec - size(); }
111 
112  Eigen::Index vector_size() const { return n; }
113 
114  size_t highwater() const { return highwatermark; }
115 };
116 
117 } // namespace pa
pa::vec_allocator::vec_allocator
vec_allocator(size_t num_vec, Eigen::Index n)
Definition: alloc.hpp:40
pa::vec_allocator
Definition: alloc.hpp:13
pa::vec_allocator::operator=
vec_allocator & operator=(vec_allocator &&)=delete
pa::vec_allocator::num_vec
size_t num_vec
Definition: alloc.hpp:15
pa::vec_allocator::findstack::crend
auto crend() const
Definition: alloc.hpp:35
pa::vec_allocator::findstack::begin
auto begin()
Definition: alloc.hpp:21
pa::vec_allocator::findstack::cend
auto cend() const
Definition: alloc.hpp:27
pa::rvec
Eigen::Ref< vec > rvec
Default type for mutable references to vectors.
Definition: vec.hpp:16
pa::NaN
constexpr real_t NaN
Not a number.
Definition: vec.hpp:28
pa::vec_allocator::alloc
auto alloc()
Definition: alloc.hpp:83
pa::vec_allocator::findstack::cbegin
auto cbegin() const
Definition: alloc.hpp:26
pa::vec_allocator::vector_size
Eigen::Index vector_size() const
Definition: alloc.hpp:112
pa::vec_allocator::highwatermark
size_t highwatermark
Definition: alloc.hpp:37
pa::vec_allocator::alloc_raii
alloc_raii_wrapper alloc_raii()
Definition: alloc.hpp:92
pa::vec_allocator::alloc_raii_wrapper::operator=
alloc_raii_wrapper & operator=(crvec v)
Definition: alloc.hpp:75
panocpy.test.v
v
Definition: test.py:42
pa
Definition: alm.hpp:10
pa::vec_allocator::used_space
size_t used_space() const
Definition: alloc.hpp:110
bicycle-obstacle-avoidance-mpc.c
c
Definition: bicycle-obstacle-avoidance-mpc.py:124
pa::vec_allocator::alloc_raii_wrapper::alloc_raii_wrapper
alloc_raii_wrapper(real_t *dptr, Eigen::Index n, vec_allocator *alloc)
Definition: alloc.hpp:56
pa::vec_allocator::alloc_raii_wrapper::v
mvec v
Definition: alloc.hpp:53
pa::vec_allocator::alloc_raii_wrapper::alloc_raii_wrapper
alloc_raii_wrapper(mvec &&v, vec_allocator *alloc)
Definition: alloc.hpp:58
pa::vec_allocator::alloc_raii_wrapper::mvec
Eigen::Map< vec > mvec
Definition: alloc.hpp:52
pa::vec_allocator::alloc_raii_wrapper::operator=
alloc_raii_wrapper & operator=(alloc_raii_wrapper &&o)
Definition: alloc.hpp:69
pa::crvec
Eigen::Ref< const vec > crvec
Default type for immutable references to vectors.
Definition: vec.hpp:18
pa::vec_allocator::findstack::rbegin
auto rbegin()
Definition: alloc.hpp:29
pa::vec_allocator::free
void free(rvec first, Vecs &&...vecs)
Definition: alloc.hpp:104
pa::vec_allocator::n
Eigen::Index n
Definition: alloc.hpp:16
pa::vec_allocator::size
size_t size() const
Definition: alloc.hpp:109
pa::vec_allocator::operator=
vec_allocator & operator=(const vec_allocator &)=delete
pa::vec_allocator::stack
pa::vec_allocator::findstack stack
pa::vec_allocator::alloc_raii_wrapper::alloc_raii_wrapper
alloc_raii_wrapper(alloc_raii_wrapper &&o)
Definition: alloc.hpp:65
pa::vec_allocator::vec_allocator
vec_allocator(const vec_allocator &)=delete
pa::vec_allocator::vec_allocator
vec_allocator(vec_allocator &&)=delete
pa::vec_allocator::findstack::end
auto end() const
Definition: alloc.hpp:24
pa::vec_allocator::findstack::rend
auto rend()
Definition: alloc.hpp:31
pa::vec_allocator::findstack::end
auto end()
Definition: alloc.hpp:23
problem.hpp
pa::vec_allocator::alloc_raii_wrapper::~alloc_raii_wrapper
~alloc_raii_wrapper()
Definition: alloc.hpp:60
pa::vec_allocator::storage
std::vector< real_t > storage
Definition: alloc.hpp:17
pa::vec_allocator::alloc_raii_wrapper::alloc
vec_allocator * alloc
Definition: alloc.hpp:54
pa::vec_allocator::alloc_raii_wrapper::operator=
alloc_raii_wrapper & operator=(const alloc_raii_wrapper &)=delete
pa::vec_allocator::findstack
Definition: alloc.hpp:18
pa::vec_allocator::alloc_raii_wrapper::alloc_raii_wrapper
alloc_raii_wrapper(const alloc_raii_wrapper &)=delete
pa::real_t
double real_t
Default floating point type.
Definition: vec.hpp:8
pa::vec_allocator::findstack::crbegin
auto crbegin() const
Definition: alloc.hpp:34
pa::vec_allocator::free
void free(rvec v)
Definition: alloc.hpp:94
pa::vec_allocator::findstack::rend
auto rend() const
Definition: alloc.hpp:32
pa::vec_allocator::findstack::begin
auto begin() const
Definition: alloc.hpp:22
pa::vec_allocator::alloc_raii_wrapper
Definition: alloc.hpp:51
pa::vec_allocator::findstack::rbegin
auto rbegin() const
Definition: alloc.hpp:30
pa::vec_allocator::highwater
size_t highwater() const
Definition: alloc.hpp:114