10#ifndef PBAT_COMMON_INDEXING_H
11#define PBAT_COMMON_INDEXING_H
33template <CIndexRange R, std::
integral TIndex = std::ranges::range_value_t<R>>
34auto CumSum(R&& sizes) -> Eigen::Vector<TIndex, Eigen::Dynamic>
36 namespace rng = std::ranges;
37 using IndexVectorType = Eigen::Vector<TIndex, Eigen::Dynamic>;
38 IndexVectorType cs(rng::size(sizes) + 1);
41 auto begin = rng::begin(sizes);
42 auto end = rng::end(sizes);
43 std::partial_sum(begin, end, bi);
56template <std::
integral TIndex>
57auto Counts(
auto begin,
auto end, TIndex ncounts) -> Eigen::Vector<TIndex, Eigen::Dynamic>
59 using IndexVectorType = Eigen::Vector<TIndex, Eigen::Dynamic>;
60 IndexVectorType counts(ncounts);
62 for (
auto it = begin; it != end; ++it)
75template <std::
integral TIndex>
76auto Shuffle(TIndex begin, TIndex end) -> Eigen::Vector<TIndex, Eigen::Dynamic>
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);
100 std::integral TIndexB,
101 std::integral TIndexE,
103 class TIndex = std::common_type_t<TIndexB, TIndexE>>
104auto Filter(TIndexB begin, TIndexE end, Func&& f) -> Eigen::Vector<TIndex, Eigen::Dynamic>
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));
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>
135 using VectorType = Eigen::Vector<TScalar, Eigen::Dynamic>;
136 VectorType y(r.sum());
137 for (
Index i = 0, k = 0; i < r.size(); ++i)
140 y.segment(k, ri).array() = x(i);
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