10 #include <dolfinx/common/array2d.h>
15 #include <xtensor/xtensor.hpp>
16 #include <xtl/xspan.hpp>
29 std::vector<T> data(array.shape(0) * array.shape(1));
30 std::vector<std::int32_t> offset(array.shape(0) + 1, 0);
31 for (std::size_t i = 0; i < array.shape(0); ++i)
33 for (std::size_t j = 0; j < array.shape(1); ++j)
34 data[i * array.shape(1) + j] = array(i, j);
35 offset[i + 1] = offset[i] + array.shape(1);
37 return std::pair(std::move(data), std::move(offset));
52 explicit AdjacencyList(
const std::int32_t n) : _array(n), _offsets(n + 1)
54 std::iota(_array.begin(), _array.end(), 0);
55 std::iota(_offsets.begin(), _offsets.end(), 0);
63 typename U,
typename V,
64 typename = std::enable_if_t<
65 std::is_same<std::vector<T>, std::decay_t<U>>::value
66 && std::is_same<std::vector<std::int32_t>, std::decay_t<V>>::value>>
68 : _array(std::forward<U>(data)), _offsets(std::forward<V>(
offsets))
70 _array.reserve(_offsets.back());
71 assert(_offsets.back() == (std::int32_t)_array.size());
82 _offsets.reserve(data.size() + 1);
83 _offsets.push_back(0);
84 for (
auto row = data.begin(); row != data.end(); ++row)
85 _offsets.push_back(_offsets.back() + row->size());
87 _array.reserve(_offsets.back());
88 for (
auto e = data.begin(); e != data.end(); ++e)
89 _array.insert(_array.end(), e->begin(), e->end());
110 return this->_array == list._array and this->_offsets == list._offsets;
115 std::int32_t
num_nodes()
const {
return _offsets.size() - 1; }
122 assert((node + 1) < (
int)_offsets.size());
123 return _offsets[node + 1] - _offsets[node];
132 return xtl::span<T>(_array.data() + _offsets[node],
133 _offsets[node + 1] - _offsets[node]);
140 xtl::span<const T>
links(
int node)
const
142 return xtl::span<const T>(_array.data() + _offsets[node],
143 _offsets[node + 1] - _offsets[node]);
147 const std::vector<T>&
array()
const {
return _array; }
150 std::vector<T>&
array() {
return _array; }
153 const std::vector<std::int32_t>&
offsets()
const {
return _offsets; }
159 s <<
"<AdjacencyList> with " + std::to_string(this->
num_nodes()) +
" nodes"
161 for (std::size_t e = 0; e < _offsets.size() - 1; ++e)
163 s <<
" " << e <<
": [";
164 for (
auto link : this->
links(e))
166 s <<
"]" << std::endl;
173 std::vector<T> _array;
176 std::vector<std::int32_t> _offsets;
185 template <
typename T,
typename U>
189 assert(data.size() % degree == 0);
190 std::vector<std::int32_t> offsets((data.size() / degree) + 1, 0);
191 for (std::size_t i = 1; i < offsets.size(); ++i)
192 offsets[i] = offsets[i - 1] + degree;
This class provides a static adjacency list data structure. It is commonly used to store directed gra...
Definition: AdjacencyList.h:47
bool operator==(const AdjacencyList &list) const
Equality operator.
Definition: AdjacencyList.h:108
std::string str() const
Return informal string representation (pretty-print)
Definition: AdjacencyList.h:156
AdjacencyList & operator=(AdjacencyList &&list)=default
Move assignment.
~AdjacencyList()=default
Destructor.
AdjacencyList(const AdjacencyList &list)=default
Copy constructor.
AdjacencyList(const std::int32_t n)
Construct trivial adjacency list where each of the n nodes is connected to itself.
Definition: AdjacencyList.h:52
const std::vector< std::int32_t > & offsets() const
Offset for each node in array() (const version)
Definition: AdjacencyList.h:153
xtl::span< T > links(int node)
Get the links (edges) for given node.
Definition: AdjacencyList.h:130
std::int32_t num_nodes() const
Get the number of nodes.
Definition: AdjacencyList.h:115
AdjacencyList(AdjacencyList &&list)=default
Move constructor.
std::vector< T > & array()
Return contiguous array of links for all nodes.
Definition: AdjacencyList.h:150
AdjacencyList(U &&data, V &&offsets)
Construct adjacency list from arrays of data.
Definition: AdjacencyList.h:67
xtl::span< const T > links(int node) const
Get the links (edges) for given node (const version)
Definition: AdjacencyList.h:140
const std::vector< T > & array() const
Return contiguous array of links for all nodes (const version)
Definition: AdjacencyList.h:147
int num_links(int node) const
Number of connections for given node.
Definition: AdjacencyList.h:120
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:79
AdjacencyList & operator=(const AdjacencyList &list)=default
Assignment.
Graph data structures and algorithms.
Definition: AdjacencyList.h:19
AdjacencyList< T > build_adjacency_list(U &&data, int degree)
Construct an adjacency list from array of data for a graph with constant degree (valency)....
Definition: AdjacencyList.h:186
auto create_adjacency_data(const xt::xtensor< T, 2 > &array)
Construct adjacency list data for a problem with a fixed number of links (edges) for each node.
Definition: AdjacencyList.h:27