Go to the documentation of this file.
19 return {{v += Ds...}};
27 using Tuple = std::tuple<TSubManifold...>;
28 using Scalars = std::tuple<
typename TSubManifold::Scalar...>;
32 {TSubManifold::kDof...}};
38 static constexpr
size_t kNumParams = [](
auto const&... sizes) {
40 (..., (
sum += sizes));
42 }(TSubManifold::kNumParams...);
44 static constexpr
size_t kDof = [](
auto const&... sizes) {
46 (..., (
sum += sizes));
48 }(TSubManifold::kDof...);
51 template <
size_t i,
class Derived>
52 static auto subBlock(Eigen::MatrixBase<Derived>
const& mat) {
54 .template block<kManifoldSizes[i], kManifoldSizes[i]>(
59 using Tangent = Eigen::Vector<Scalar, kDof>;
66 : manifolds_(manifolds...) {}
71 return std::get<i>(manifolds_);
77 return std::get<i>(manifolds_);
83 [](
auto const& manifold,
auto const& tangent) {
84 return manifold.oplus(tangent);
95 [](
auto const& manifold,
auto const& other) {
96 return manifold.ominus(other);
105 std::vector<Tangent> out;
112 template <
size_t kArrayLen>
117 averageImpl<0, kArrayLen>(result, range);
122 template <
int k,
size_t kArrayLen>
123 static auto averageImpl(
127 template <
size_t i = 0>
128 static auto getTangent(
Tangent& t) {
129 auto v = std::tuple_element_t<i, Tuple>::tangentExamples();
130 getBlock<i>(t) = v[0];
131 if constexpr (i <
sizeof...(TSubManifold) - 1) {
133 getTangent<i + 1>(t);
138 template <
size_t i = 0>
140 getBlock<i>(out) =
func(getBlock<i>(manifolds_), getBlock<i>(in));
142 if constexpr (i <
sizeof...(TSubManifold) - 1) {
143 oplusImpl<i + 1>(
func, out, in);
147 template <
size_t i = 0>
153 getBlock<i>(tangent) =
func(getBlock<i>(out), getBlock<i>(in));
155 if constexpr (i <
sizeof...(TSubManifold) - 1) {
156 ominusImpl<i + 1>(
func, out, in, tangent);
161 static auto& getBlock(
Tuple& g) {
162 return std::get<i>(g);
166 static auto const& getBlock(
Tuple const& g) {
167 return std::get<i>(g);
171 static auto getBlock(
Tangent& tangent) {
174 return tangent.template segment<size>(offset);
178 static auto getBlock(
Tangent const& tangent) {
181 return tangent.template segment<size>(offset);
188 template <
int k,
size_t kArrayLen,
class... TManifold>
189 struct ContainerAdapter {
190 using Container = ProductManifold<TManifold...>;
191 using ContainerArray = std::array<Container, kArrayLen>;
192 using value_type = std::decay_t<
193 decltype(std::declval<Container>().
template subManifold<k>())>;
196 using iterator_category = std::forward_iterator_tag;
197 using difference_type = std::ptrdiff_t;
199 typename ContainerAdapter<k, kArrayLen, TManifold...>::value_type;
200 using pointer = value_type
const*;
201 using reference = value_type
const&;
203 Iterator(
typename ContainerArray::const_iterator it) : it_(it) {}
205 reference
operator*()
const {
return it_->template subManifold<k>(); }
206 pointer operator->() {
return &
operator*(); }
209 Iterator& operator++() {
215 Iterator operator++(
int) {
216 Iterator tmp = *
this;
221 friend bool operator==(Iterator
const& a, Iterator
const& b) {
222 return a.it_ == b.it_;
224 friend bool operator!=(Iterator
const& a, Iterator
const& b) {
225 return a.it_ != b.it_;
229 typename ContainerArray::const_iterator it_;
232 ContainerAdapter(std::array<Container, kArrayLen>
const& ref) : ref(ref) {}
234 using const_iterator = Iterator;
235 using iterator = Iterator;
236 Iterator cbegin()
const {
return Iterator(ref.cbegin()); }
237 Iterator cend()
const {
return Iterator(ref.cend()); }
238 Iterator begin()
const {
return cbegin(); }
239 Iterator end()
const {
return cend(); }
241 std::array<Container, kArrayLen>
const& ref;
246 template <
int k,
size_t kArrayLen>
247 auto ProductManifold<TSubManifold...>::averageImpl(
248 ProductManifold<TSubManifold...>& result,
249 std::array<ProductManifold<TSubManifold...>, kArrayLen>
const& range) {
250 details::ContainerAdapter<k, kArrayLen, TSubManifold...> adapter(range);
251 auto const maybe_avg = std::tuple_element_t<
253 typename ProductManifold<TSubManifold...>::Tuple>
::average(adapter);
254 result.template subManifold<k>() =
FARM_UNWRAP(maybe_avg);
256 if constexpr (k <
sizeof...(TSubManifold) - 1) {
258 averageImpl<k + 1, kArrayLen>(result, range);
std::tuple< typename TSubManifold::Scalar... > Scalars
Definition: product_manifold.h:28
#define SOPHUS_ASSERT_GE(...)
Definition: common.h:42
auto average(TSequenceContainer const &foo_from_bar_transforms) -> std::enable_if_t< std::is_same< typename TSequenceContainer::value_type, Translation< TScalar, kPointDim > >::value, std::optional< typename TSequenceContainer::value_type > >
Definition: average.h:81
static constexpr std::array< int, kNumManifolds > kManifoldSizes
Definition: product_manifold.h:31
static constexpr size_t kNumManifolds
Definition: product_manifold.h:30
std::tuple< TSubManifold... > Tuple
Definition: product_manifold.h:27
Image MutImage, owning images types.
Definition: num_diff.h:20
static auto tangentExamples() -> std::vector< Tangent >
Definition: product_manifold.h:104
constexpr std::array< int, sizeof...(Ds)> cumulativeSum()
Definition: product_manifold.h:17
static constexpr size_t kDof
Definition: product_manifold.h:44
ProductManifold(TSubManifold const &... manifolds)
Definition: product_manifold.h:65
Definition: product_manifold.h:23
auto operator*(Isometry2< TT > const &bar_from_foo, Ray< TT, 2 > const &ray_foo) -> Ray< TT, 2 >
Definition: ray.h:97
ProductManifold()=default
auto operator!=(ImageSize const &lhs, ImageSize const &rhs) -> bool
Definition: image_size.cpp:37
static constexpr std::array< int, kNumManifolds+1 > kManifoldStarts
Definition: product_manifold.h:33
auto sum(Expected< A > maybe_left, Expected< A > maybe_right) -> Expected< A >
Definition: expected_test.cpp:98
static std::optional< ProductManifold< TSubManifold... > > average(std::array< ProductManifold< TSubManifold... >, kArrayLen > const &range)
Definition: product_manifold.h:113
auto ominus(Self const &other) const -> Tangent
Definition: product_manifold.h:91
static constexpr size_t kNumParams
Definition: product_manifold.h:38
static auto subBlock(Eigen::MatrixBase< Derived > const &mat)
Definition: product_manifold.h:52
auto operator==(Region< TT > const &lhs, Region< TT > const &rhs) -> bool
Definition: region.h:367
Eigen::Vector< Scalar, kDof > Tangent
Definition: product_manifold.h:59
auto & subManifold()
Definition: product_manifold.h:70
concept Manifold
Definition: manifold.h:33
auto const & subManifold() const
Definition: product_manifold.h:76
ProductManifold & operator=(ProductManifold const &)=default
typename std::tuple_element< 0, Scalars >::type Scalar
Definition: product_manifold.h:36
auto oplus(Tangent const &tangent) const -> Self
Definition: product_manifold.h:80
func
Definition: event_service_recorder.py:420
#define FARM_UNWRAP(wrapper,...)
Returns *wrapper, but panics if wrapper is nullopt or null.
Definition: logger.h:576
type
Definition: event_service.py:547