35 std::iota(_array.begin(), _array.end(), 0);
36 std::iota(_offsets.begin(), _offsets.end(), 0);
43 template <
typename U,
typename V>
44 requires std::is_convertible_v<std::remove_cvref_t<U>, std::vector<T>>
45 and std::is_convertible_v<std::remove_cvref_t<V>,
46 std::vector<std::int32_t>>
50 _array.reserve(_offsets.back());
51 assert(_offsets.back() == (std::int32_t)_array.size());
63 _offsets.reserve(
data.size() + 1);
64 _offsets.push_back(0);
66 _offsets.push_back(_offsets.back() +
row.size());
68 _array.reserve(_offsets.back());
70 _array.insert(_array.end(),
e.begin(),
e.end());
92 return this->_array ==
list._array
and this->_offsets ==
list._offsets;
97 std::int32_t
num_nodes()
const {
return _offsets.size() - 1; }
105 return _offsets[
node + 1] - _offsets[
node];
114 return std::span<T>(_array.data() + _offsets[
node],
115 _offsets[
node + 1] - _offsets[
node]);
124 return std::span<const T>(_array.data() + _offsets[
node],
125 _offsets[
node + 1] - _offsets[
node]);
129 const std::vector<T>&
array()
const {
return _array; }
132 std::vector<T>&
array() {
return _array; }
135 const std::vector<std::int32_t>&
offsets()
const {
return _offsets; }
138 std::vector<std::int32_t>&
offsets() {
return _offsets; }
145 s <<
"<AdjacencyList> with " + std::to_string(this->
num_nodes()) +
" nodes"
147 for (std::size_t
e = 0;
e < _offsets.size() - 1; ++
e)
149 s <<
" " <<
e <<
": [";
152 s <<
"]" << std::endl;
159 std::vector<T> _array;
162 std::vector<std::int32_t> _offsets;
166template <
typename T,
typename U>
167AdjacencyList(T, U) -> AdjacencyList<typename T::value_type>;
178 typename std::decay_t<U>::value_type;
179 requires std::convertible_to<
180 U, std::vector<typename std::decay_t<U>::value_type>>;
182AdjacencyList<typename std::decay_t<U>::value_type>
185 if (degree == 0 and !data.empty())
187 throw std::runtime_error(
"Degree is zero but data is not empty for "
188 "constant degree AdjacencyList");
191 if (degree > 0 and data.size() % degree != 0)
193 throw std::runtime_error(
194 "Incompatible data size and degree for constant degree AdjacencyList");
197 std::int32_t num_nodes = degree == 0 ? data.size() : data.size() / degree;
198 std::vector<std::int32_t> offsets(num_nodes + 1, 0);
199 for (std::size_t i = 1; i < offsets.size(); ++i)
200 offsets[i] = offsets[i - 1] + degree;
202 std::forward<U>(data), std::move(offsets));
This class provides a static adjacency list data structure. It is commonly used to store directed gra...
Definition AdjacencyList.h:28
int num_links(std::size_t node) const
Number of connections for given node.
Definition AdjacencyList.h:102
std::span< T > links(std::size_t node)
Get the links (edges) for given node.
Definition AdjacencyList.h:112
bool operator==(const AdjacencyList &list) const
Equality operator.
Definition AdjacencyList.h:90
std::vector< std::int32_t > & offsets()
Offset for each node in array()
Definition AdjacencyList.h:138
const std::vector< T > & array() const
Return contiguous array of links for all nodes (const version)
Definition AdjacencyList.h:129
AdjacencyList & operator=(AdjacencyList &&list)=default
Move assignment operator.
and std::is_convertible_v< std::remove_cvref_t< V >, std::vector< std::int32_t > > AdjacencyList(U &&data, V &&offsets)
Construct adjacency list from arrays of data.
Definition AdjacencyList.h:47
std::span< const T > links(std::size_t node) const
Get the links (edges) for given node (const version)
Definition AdjacencyList.h:122
AdjacencyList(const std::int32_t n)
Construct trivial adjacency list where each of the n nodes is connected to itself.
Definition AdjacencyList.h:33
AdjacencyList(AdjacencyList &&list)=default
Move constructor.
AdjacencyList & operator=(const AdjacencyList &list)=default
Assignment operator.
AdjacencyList(const std::vector< X > &data)
Set all connections for all entities (T is a '2D' container, e.g. a std::vector<<std::vector<std::siz...
Definition AdjacencyList.h:60
std::int32_t num_nodes() const
Get the number of nodes.
Definition AdjacencyList.h:97
AdjacencyList(const AdjacencyList &list)=default
Copy constructor.
std::vector< T > & array()
Return contiguous array of links for all nodes.
Definition AdjacencyList.h:132
const std::vector< std::int32_t > & offsets() const
Offset for each node in array() (const version)
Definition AdjacencyList.h:135
std::string str() const
Informal string representation (pretty-print)
Definition AdjacencyList.h:142
~AdjacencyList()=default
Destructor.
Graph data structures and algorithms.
Definition dofmapbuilder.h:25
AdjacencyList< typename std::decay_t< U >::value_type > regular_adjacency_list(U &&data, int degree)
Construct a constant degree (valency) adjacency list.
Definition AdjacencyList.h:183