PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
Loading...
Searching...
No Matches
Indexing.h
Go to the documentation of this file.
1
9
10#ifndef PBAT_COMMON_INDEXING_H
11#define PBAT_COMMON_INDEXING_H
12
13#include "Concepts.h"
14#include "Eigen.h"
15#include "pbat/Aliases.h"
16
17#include <concepts>
18#include <numeric>
19#include <random>
20#include <ranges>
21
22namespace pbat {
23namespace common {
24
33template <CIndexRange R, std::integral TIndex = std::ranges::range_value_t<R>>
34auto CumSum(R&& sizes) -> Eigen::Vector<TIndex, Eigen::Dynamic>
35{
36 namespace rng = std::ranges;
37 using IndexVectorType = Eigen::Vector<TIndex, Eigen::Dynamic>;
38 IndexVectorType cs(rng::size(sizes) + 1);
39 auto bi = cs.data();
40 *bi++ = Index{0};
41 auto begin = rng::begin(sizes);
42 auto end = rng::end(sizes);
43 std::partial_sum(begin, end, bi);
44 return cs;
45}
46
56template <std::integral TIndex>
57auto Counts(auto begin, auto end, TIndex ncounts) -> Eigen::Vector<TIndex, Eigen::Dynamic>
58{
59 using IndexVectorType = Eigen::Vector<TIndex, Eigen::Dynamic>;
60 IndexVectorType counts(ncounts);
61 counts.setZero();
62 for (auto it = begin; it != end; ++it)
63 ++counts(*it);
64 return counts;
65}
66
75template <std::integral TIndex>
76auto Shuffle(TIndex begin, TIndex end) -> Eigen::Vector<TIndex, Eigen::Dynamic>
77{
78 auto iota = std::views::iota(begin, end);
79 Eigen::Vector<TIndex, Eigen::Dynamic> inds(end - begin);
80 std::copy(std::ranges::begin(iota), std::ranges::end(iota), inds.begin());
81 std::random_device rd{};
82 std::mt19937 gen{rd()};
83 std::ranges::shuffle(inds, gen);
84 return inds;
85}
86
99template <
100 std::integral TIndexB,
101 std::integral TIndexE,
102 class Func,
103 class TIndex = std::common_type_t<TIndexB, TIndexE>>
104auto Filter(TIndexB begin, TIndexE end, Func&& f) -> Eigen::Vector<TIndex, Eigen::Dynamic>
105{
106 auto filteredView = std::views::iota(static_cast<TIndex>(begin), static_cast<TIndex>(end)) |
107 std::views::filter(f);
108 std::vector<TIndex> filtered{};
109 filtered.reserve(static_cast<std::size_t>(end - begin));
110 std::ranges::copy(filteredView, std::back_inserter(filtered));
111 return ToEigen(filtered);
112}
113
127template <
128 class TDerivedX,
129 class TDerivedR,
130 class TScalar = typename TDerivedX::Scalar,
131 std::integral TIndex = typename TDerivedR::Scalar>
132auto Repeat(Eigen::DenseBase<TDerivedX> const& x, Eigen::DenseBase<TDerivedR> const& r)
133 -> Eigen::Vector<TScalar, Eigen::Dynamic>
134{
135 using VectorType = Eigen::Vector<TScalar, Eigen::Dynamic>;
136 VectorType y(r.sum());
137 for (Index i = 0, k = 0; i < r.size(); ++i)
138 {
139 auto ri = r(i);
140 y.segment(k, ri).array() = x(i);
141 k += ri;
142 }
143 return y;
144}
145
146} // namespace common
147} // namespace pbat
148
149#endif // PBAT_COMMON_INDEXING_H
Concepts for common types.
Eigen adaptors for ranges.
Common functionality.
Definition ArgSort.h:20
auto Filter(TIndexB begin, TIndexE end, Func &&f) -> Eigen::Vector< TIndex, Eigen::Dynamic >
Filters a range of integers based on a predicate function.
Definition Indexing.h:104
auto Counts(auto begin, auto end, TIndex ncounts) -> Eigen::Vector< TIndex, Eigen::Dynamic >
Counts the number of occurrences of each integer in a contiguous range.
Definition Indexing.h:57
auto Shuffle(TIndex begin, TIndex end) -> Eigen::Vector< TIndex, Eigen::Dynamic >
Randomly shuffle a range of integers.
Definition Indexing.h:76
auto CumSum(R &&sizes) -> Eigen::Vector< TIndex, Eigen::Dynamic >
Cumulative sum of a range of integers.
Definition Indexing.h:34
auto ToEigen(R &&r) -> Eigen::Map< Eigen::Vector< std::ranges::range_value_t< R >, Eigen::Dynamic > const >
Map a range of scalars to an eigen vector of such scalars.
Definition Eigen.h:28
auto Repeat(Eigen::DenseBase< TDerivedX > const &x, Eigen::DenseBase< TDerivedR > const &r) -> Eigen::Vector< TScalar, Eigen::Dynamic >
Repeats elements of a vector according to a repetition vector.
Definition Indexing.h:132
The main namespace of the library.
Definition Aliases.h:15
std::ptrdiff_t Index
Index type.
Definition Aliases.h:17