FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
coloring.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8// includes, FEAT
11#include <kernel/util/memory_pool.hpp>
12
13#ifdef FEAT_HAVE_CUDA
14#include <kernel/util/cuda_util.hpp>
15#endif
16
17// includes, system
18#include <vector>
19#include <algorithm>
20#include <numeric>
21
22namespace FEAT
23{
24 namespace Adjacency
25 {
26 // forward declaration
27 class Graph;
28
37 {
38 protected:
39 using IndexVector = std::vector < Index>;
40
43
53 IndexVector _coloring;
54
55 public:
56
62 Coloring();
63
81 Index num_nodes,
82 Index num_colors);
83
96 Index num_nodes,
97 Index* coloring);
98
110 Coloring(
111 Index num_colors,
112 const IndexVector& coloring);
113
123 explicit Coloring(const Graph& graph);
124
138 explicit Coloring(const Graph& graph, const Index* order);
139
141 Coloring(Coloring&& other) noexcept;
142
144 Coloring& operator=(Coloring&& other) noexcept;
145
147 virtual ~Coloring();
148
155 {
156 if (!_coloring.empty())
157 //return Coloring(Index(_coloring.size()), _coloring.data());
159 else
160 return Coloring();
161 }
162
170
176 {
177 return _coloring.data();
178 }
179
181 const Index* get_coloring() const
182 {
183 return _coloring.data();
184 }
185
192 {
193 return Index(_coloring.size());
194 }
195
197 auto size() const -> decltype(_coloring.size())
198 {
199 return _coloring.size();
200 }
201
208 {
209 return _num_colors - 1;
210 }
211
218 {
219 return _num_colors;
220 }
221
223 bool empty() const
224 {
225 return _coloring.empty();
226 }
227
230 {
231 ASSERT(i < _coloring.size());
232 return _coloring[i];
233 }
234
236 const Index& operator[](Index i) const
237 {
238 ASSERT(i < _coloring.size());
239 return _coloring[i];
240 }
241 }; // class Coloring
242
253 {
254 public:
256 std::vector<int*> _coloring_maps;
258 std::vector<Index> _coloring_map_sizes;
259
260 explicit ColoringDataHandler() = default;
261
276 template<typename ColoringType_>
277 ColoringDataHandler(const ColoringType_& coloring, int hint = -1)
278 {
279 fill_color(coloring, hint);
280 }
281
283 {
284 release_color();
285 }
286
287 ColoringDataHandler(const ColoringDataHandler&) = delete;
288
289 ColoringDataHandler& operator=(const ColoringDataHandler&) = delete;
290
291
292 ColoringDataHandler(ColoringDataHandler&& other) noexcept
293 {
294 _coloring_maps = std::move(other._coloring_maps);
295 _coloring_map_sizes = std::move(other._coloring_map_sizes);
296 other._coloring_maps.clear();
297 other._coloring_map_sizes.clear();
298 }
299
300 ColoringDataHandler& operator=(ColoringDataHandler&& other) noexcept
301 {
302 if(this == &other)
303 return *this;
304 release_color();
305 _coloring_maps = std::move(other._coloring_maps);
306 _coloring_map_sizes = std::move(other._coloring_map_sizes);
307 other._coloring_maps.clear();
308 other._coloring_map_sizes.clear();
309 return *this;
310 }
311
314 {
315 return _coloring_map_sizes.size();
316 }
317
318 Index get_color_size(Index k) const
319 {
320 return _coloring_map_sizes.at(k);
321 }
322
323 std::vector<Index>& get_color_sizes()
324 {
325 return _coloring_map_sizes;
326 }
327
328 const std::vector<Index>& get_color_sizes() const
329 {
330 return _coloring_map_sizes;
331 }
332
335 {
336 return _coloring_maps.at(k);
337 }
338
340 const int* get_color_map(Index k) const
341 {
342 return _coloring_maps.at(k);
343 }
344
346 std::vector<int*>& get_coloring_maps()
347 {
348 return _coloring_maps;
349 }
350
352 const std::vector<int*>& get_coloring_maps() const
353 {
354 return _coloring_maps;
355 }
356
359 {
360 return Index(std::accumulate(_coloring_map_sizes.begin(), _coloring_map_sizes.end(), Index(0), [](Index a, Index b){return std::max(a,b);}));
361 }
362
363
370 void fill_color(const std::vector<int>& coloring, int hint = -1)
371 {
372 int num_colors = hint;
373 if(hint < 0)
374 {
375 num_colors = *std::max_element(coloring.begin(), coloring.end()) + 1;
376 }
377 // fill tmp vector with coloring
378 std::vector<std::vector<int>> tmp_vector;
379 tmp_vector.resize(Index(num_colors));
380 for(std::size_t i = 0; i < coloring.size(); ++i)
381 {
382 tmp_vector.at(std::size_t(coloring.at(i))).push_back(int(i));
383 }
384 _coloring_maps.resize(std::size_t(num_colors));
385 _coloring_map_sizes.resize(std::size_t(num_colors));
386 for(Index i = 0; i < Index(num_colors); ++i)
387 {
388 _coloring_maps.at(i) = MemoryPool::allocate_memory<int>(tmp_vector.at(i).size());
389 MemoryPool::copy(_coloring_maps.at(i), tmp_vector.at(i).data(), tmp_vector.at(i).size());
390 _coloring_map_sizes.at(i) = tmp_vector.at(i).size();
391 }
392
393 }
394
402 void fill_color(const Coloring& coloring, int hint = -1)
403 {
404 int num_colors = int(coloring.get_num_colors());
405 if(hint >= 0)
406 {
407 ASSERTM(num_colors == hint, "Hint and number of colors do not fit!");
408 }
409
410 // fill tmp vector with coloring
411 std::vector<std::vector<int>> tmp_vector;
412 tmp_vector.resize(Index(num_colors));
413 for(std::size_t i = 0; i < coloring.size(); ++i)
414 {
415 tmp_vector.at(std::size_t(coloring[i])).push_back(int(i));
416 }
417 _coloring_maps.resize(std::size_t(num_colors));
418 _coloring_map_sizes.resize(std::size_t(num_colors));
419 for(Index i = 0; i < Index(num_colors); ++i)
420 {
421 _coloring_maps.at(i) = MemoryPool::allocate_memory<int>(tmp_vector.at(i).size());
422 MemoryPool::copy(_coloring_maps.at(i), tmp_vector.at(i).data(), tmp_vector.at(i).size());
423 _coloring_map_sizes.at(i) = Index(tmp_vector.at(i).size());
424 }
425 }
426
427 void release_color()
428 {
429 for(Index i = 0; i < _coloring_maps.size(); ++i)
430 {
432 }
433 _coloring_maps.clear();
434 _coloring_map_sizes.clear();
435 }
436
437 bool initialized() const
438 {
439 return _coloring_maps.size() > 0u;
440 }
441
442 Index get_max_size() const
443 {
444 return std::accumulate(_coloring_map_sizes.begin(), _coloring_map_sizes.end(), Index(0), [](const Index& a, const Index& b){return std::max(a, b);});
445 }
446 }; // class ColoringDataHandler
447 } // namespace Adjacency
448} // namespace FEAT
#define ASSERT(expr)
Debug-Assertion macro definition.
Definition: assertion.hpp:229
#define ASSERTM(expr, msg)
Debug-Assertion macro definition with custom message.
Definition: assertion.hpp:230
FEAT Kernel base header.
Datahandler for inverse coloring data.
Definition: coloring.hpp:253
Index get_max_color_size() const
Get max size of all colors.
Definition: coloring.hpp:358
Index get_num_colors() const
Returns the number of colors.
Definition: coloring.hpp:313
int * get_color_map(Index k)
Get the k-th color map.
Definition: coloring.hpp:334
void fill_color(const std::vector< int > &coloring, int hint=-1)
Fill in the coloring array.
Definition: coloring.hpp:370
const std::vector< int * > & get_coloring_maps() const
Retrieve the color maps.
Definition: coloring.hpp:352
const int * get_color_map(Index k) const
Get the k-th color map.
Definition: coloring.hpp:340
void fill_color(const Coloring &coloring, int hint=-1)
Fill in the coloring array.
Definition: coloring.hpp:402
std::vector< int * > _coloring_maps
vector of unified memory pointer
Definition: coloring.hpp:256
std::vector< int * > & get_coloring_maps()
Retrieve the color maps.
Definition: coloring.hpp:346
std::vector< Index > _coloring_map_sizes
vector of coloring sizes
Definition: coloring.hpp:258
ColoringDataHandler(const ColoringType_ &coloring, int hint=-1)
Constructor receiving coloring data and optional hint.
Definition: coloring.hpp:277
Coloring object implementation.
Definition: coloring.hpp:37
const Index & operator[](Index i) const
Returns the color for a node i.
Definition: coloring.hpp:236
Index & operator[](Index i)
Returns the color for a node i.
Definition: coloring.hpp:229
IndexVector _coloring
coloring vector
Definition: coloring.hpp:53
Graph create_partition_graph() const
Creates a color partition graph.
Definition: coloring.cpp:292
Index _num_colors
total number of colors used
Definition: coloring.hpp:42
Index get_num_nodes() const
Returns the total number of nodes.
Definition: coloring.hpp:191
virtual ~Coloring()
virtual destructor
Definition: coloring.cpp:289
bool empty() const
Checks whether the coloring is empty.
Definition: coloring.hpp:223
auto size() const -> decltype(_coloring.size())
Returns the total number of nodes.
Definition: coloring.hpp:197
Coloring & operator=(Coloring &&other) noexcept
move-assign operator
Definition: coloring.cpp:273
Index get_max_color() const
Returns the maximum color index.
Definition: coloring.hpp:207
Coloring()
Default constructor.
Definition: coloring.cpp:21
Index * get_coloring()
Returns the coloring array.
Definition: coloring.hpp:175
const Index * get_coloring() const
Returns the coloring array.
Definition: coloring.hpp:181
Index get_num_colors() const
Returns the number of colors.
Definition: coloring.hpp:217
Coloring clone() const
Clones this coloring.
Definition: coloring.hpp:154
Adjacency Graph implementation.
Definition: graph.hpp:34
static void copy(DT_ *dest, const DT_ *src, const Index count)
Copy memory area from src to dest.
static void release_memory(void *address)
release memory or decrease reference counter
FEAT namespace.
Definition: adjactor.hpp:12
std::uint64_t Index
Index data type.