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; }
157 template <
typename X>
162 #ifdef __INTEL_COMPILER
163 #pragma warning(disable : 1011)
166 if constexpr (std::is_same<X, T>::value)
171 std::vector<X>(_array.begin(), _array.end()), this->_offsets);
179 s <<
"<AdjacencyList> with " + std::to_string(this->
num_nodes()) +
" nodes"
181 for (std::size_t e = 0; e < _offsets.size() - 1; ++e)
183 s <<
" " << e <<
": [";
184 for (
auto link : this->
links(e))
186 s <<
"]" << std::endl;
193 std::vector<T> _array;
196 std::vector<std::int32_t> _offsets;
205 template <
typename T,
typename U>
209 assert(data.size() % degree == 0);
210 std::vector<std::int32_t> offsets(data.size() / degree + 1, 0);
211 for (std::size_t i = 1; i < offsets.size(); ++i)
212 offsets[i] = offsets[i - 1] + degree;