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
BreadthFirstSearch.h
1#ifndef PBAT_GRAPH_BREADTHFIRSTSEARCH_H
2#define PBAT_GRAPH_BREADTHFIRSTSEARCH_H
3
4#include "pbat/Aliases.h"
7
8#include <queue>
9
10namespace pbat::graph {
11
12template <common::CIndex TIndex = Index>
13struct BreadthFirstSearch
14{
15 using IndexType = TIndex;
16 using QueueType = std::queue<IndexType>;
17
18 BreadthFirstSearch() = default;
23 BreadthFirstSearch(Eigen::Index n);
28 void Reserve(Eigen::Index n);
40 template <class FVisit, class TDerivedP, class TDerivedAdj>
41 void operator()(
42 Eigen::DenseBase<TDerivedP> const& ptr,
43 Eigen::DenseBase<TDerivedAdj> const& adj,
44 TIndex start,
45 FVisit fVisit);
50 Eigen::Index NumVertices() const { return visited.size(); }
51
52 Eigen::Vector<bool, Eigen::Dynamic> visited;
54};
55
56template <common::CIndex TIndex>
57inline BreadthFirstSearch<TIndex>::BreadthFirstSearch(Eigen::Index n)
58{
59 Reserve(n);
60}
61
62template <common::CIndex TIndex>
63inline void BreadthFirstSearch<TIndex>::Reserve(Eigen::Index n)
64{
65 PBAT_PROFILE_NAMED_SCOPE("pbat.graph.BreadthFirstSearch.Reserve");
66 visited.resize(n);
67}
68
69template <common::CIndex TIndex>
70template <class FVisit, class TDerivedP, class TDerivedAdj>
72 Eigen::DenseBase<TDerivedP> const& ptr,
73 Eigen::DenseBase<TDerivedAdj> const& adj,
74 TIndex start,
75 FVisit fVisit)
76{
77 PBAT_PROFILE_NAMED_SCOPE("pbat.graph.BreadthFirstSearch");
78 visited.setConstant(false);
79 queue.push(start);
80 while (not queue.empty())
81 {
82 IndexType u = queue.front();
83 queue.pop();
84 if (not visited[u])
85 {
86 fVisit(u);
87 visited[u] = true;
88 auto kBegin = ptr[u];
89 auto kEnd = ptr[u + 1];
90 for (auto k = kBegin; k < kEnd; ++k)
91 {
92 IndexType v = static_cast<IndexType>(adj[k]);
93 queue.push(v);
94 }
95 }
96 }
97}
98
99} // namespace pbat::graph
100
101#endif // PBAT_GRAPH_BREADTHFIRSTSEARCH_H
Concepts for common types.
Definition Adjacency.h:24
Profiling utilities for the Physics-Based Animation Toolkit (PBAT)
std::queue< IndexType > QueueType
Queue type used for BFS.
Definition BreadthFirstSearch.h:16
void Reserve(Eigen::Index n)
Reserve memory for n vertices.
Definition BreadthFirstSearch.h:63
Eigen::Index NumVertices() const
Get the number of vertices in the graph.
Definition BreadthFirstSearch.h:50
TIndex IndexType
Index type used in the breadth-first search.
Definition BreadthFirstSearch.h:15
QueueType queue
BFS search queue.
Definition BreadthFirstSearch.h:53
void operator()(Eigen::DenseBase< TDerivedP > const &ptr, Eigen::DenseBase< TDerivedAdj > const &adj, TIndex start, FVisit fVisit)
Perform depth-first search on the graph.
Definition BreadthFirstSearch.h:71
Eigen::Vector< bool, Eigen::Dynamic > visited
|# vertices| x 1 visited mask
Definition BreadthFirstSearch.h:52