alpaqa 1.1.0a1
Nonconvex constrained optimization
Loading...
Searching...
No Matches
span.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Eigen/Core>
4#include <span>
5#include <type_traits>
6
7namespace alpaqa {
8
9namespace detail {
10template <Eigen::Index R>
11constexpr auto to_std_extent =
12 R == Eigen::Dynamic ? std::dynamic_extent : static_cast<size_t>(R);
13template <size_t E>
14constexpr auto to_eigen_extent =
15 E == std::dynamic_extent ? Eigen::Dynamic : static_cast<Eigen::Index>(E);
16} // namespace detail
17
18/// Convert an Eigen vector view to a `std::span`.
19template <class Derived>
20 requires(Derived::ColsAtCompileTime == 1)
21auto as_span(Eigen::DenseBase<Derived> &v) {
23 using T = std::remove_pointer_t<decltype(v.derived().data())>;
24 return std::span<T, E>{v.derived().data(), static_cast<size_t>(v.size())};
25}
26
27/// Convert an Eigen vector view to a `std::span`.
28template <class Derived>
29 requires(Derived::ColsAtCompileTime == 1)
30auto as_span(Eigen::DenseBase<Derived> &&v) {
31 using PlainObjectBase = Eigen::PlainObjectBase<std::decay_t<Derived>>;
32 static_assert(!std::is_base_of_v<PlainObjectBase, std::decay_t<Derived>>,
33 "Refusing to return a span to a temporary Eigen vector with "
34 "its own storage");
36 using T = std::remove_pointer_t<decltype(v.derived().data())>;
37 return std::span<T, E>{v.derived().data(), static_cast<size_t>(v.size())};
38}
39
40/// Convert an Eigen vector view to a `std::span`.
41template <class Derived>
42 requires(Derived::ColsAtCompileTime == 1)
43auto as_span(const Eigen::DenseBase<Derived> &v) {
45 using T = std::remove_pointer_t<decltype(v.derived().data())>;
46 return std::span<T, E>{v.derived().data(), static_cast<size_t>(v.size())};
47}
48
49/// Convert a `std::span` to an Eigen::Vector view.
50template <class T, size_t E>
51auto as_vec(std::span<T, E> s) {
52 constexpr auto R = detail::to_eigen_extent<E>;
53 using S = std::remove_const_t<T>;
54 using V = Eigen::Vector<S, R>;
55 using Map = Eigen::Map<std::conditional_t<std::is_const_v<T>, const V, V>>;
56 if constexpr (R == Eigen::Dynamic)
57 return Map{s.data(), static_cast<Eigen::Index>(s.size())};
58 else
59 return Map{s.data()};
60}
61
62} // namespace alpaqa
constexpr auto to_std_extent
Definition span.hpp:11
constexpr auto to_eigen_extent
Definition span.hpp:14
auto as_span(Eigen::DenseBase< Derived > &v)
Convert an Eigen vector view to a std::span.
Definition span.hpp:21
auto as_vec(std::span< T, E > s)
Convert a std::span to an Eigen::Vector view.
Definition span.hpp:51