8#include <kernel/adjacency/coloring.hpp>
9#include <kernel/adjacency/graph.hpp>
14#include <unordered_set>
32 _num_colors(num_colors)
43 std::unordered_set<Index> colors;
44 for (
Index i(0) ; i < num_nodes ; ++i)
46 colors.insert(coloring[i]);
52 for(
Index i(0); i< num_nodes; i++)
62 const IndexVector& coloring) :
63 _num_colors(num_colors),
72 Index num_nodes_domain = graph.get_num_nodes_domain();
76 if(num_nodes_domain ==
Index(0))
80 _coloring = IndexVector(num_nodes_domain);
89 std::vector<Index> col_aux(mnc);
92 std::vector<Index> col_num(mnc,
Index(0));
98 Index min_color_index;
101 for(
Index i(0); i < num_nodes_domain; ++i)
104 for(
Index j(0); j < mnc; ++j)
110 lower_bound = domain_ptr[i];
111 upper_bound = domain_ptr[i+1];
112 for(
Index j(lower_bound); j < upper_bound; ++j)
124 min_color_uses = num_nodes_domain + 1;
127 min_color_index = num_nodes_domain + 1;
134 if(col_num[j] < min_color_uses)
136 min_color_uses = col_num[j];
143 if(min_color_index != num_nodes_domain +1)
147 ++col_num[min_color_index];
164 Index num_nodes_domain = graph.get_num_nodes_domain();
168 if(num_nodes_domain ==
Index(0))
172 _coloring = IndexVector(num_nodes_domain);
181 std::vector<Index> col_aux(mnc);
184 std::vector<Index> col_num(mnc,
Index(0));
189 Index min_color_uses;
190 Index min_color_index;
196 for(
Index j(0); j < num_nodes_domain; ++j)
202 for(
Index k(0); k < num_nodes_domain; ++k)
208 for(
Index j(0); j < mnc; ++j)
214 lower_bound = domain_ptr[i];
215 upper_bound = domain_ptr[i+1];
216 for(
Index j(lower_bound); j < upper_bound; ++j)
218 if(
_coloring[image_idx[j]] != num_nodes_domain + 1)
228 min_color_uses = num_nodes_domain + 1;
231 min_color_index = num_nodes_domain + 1;
238 if(col_num[j] < min_color_uses)
240 min_color_uses = col_num[j];
247 if(min_color_index != num_nodes_domain +1)
251 ++col_num[min_color_index];
265 _num_colors(other._num_colors),
266 _coloring(std::forward<IndexVector>(other._coloring))
268 other._num_colors =
Index(0);
269 other._coloring.clear();
279 _num_colors = other._num_colors;
280 _coloring = std::forward<IndexVector>(other._coloring);
282 other._num_colors =
Index(0);
283 other._coloring.clear();
299 domain_ptr[0] =
Index(0);
316 image_idx[idx_counter] = j;
320 domain_ptr[i+1] = idx_counter;
Coloring object implementation.
IndexVector _coloring
coloring vector
Graph create_partition_graph() const
Creates a color partition graph.
Index _num_colors
total number of colors used
Index get_num_nodes() const
Returns the total number of nodes.
virtual ~Coloring()
virtual destructor
Coloring & operator=(Coloring &&other) noexcept
move-assign operator
Index get_max_color() const
Returns the maximum color index.
Coloring()
Default constructor.
Adjacency Graph implementation.
Index * get_domain_ptr()
Returns the domain pointer array.
Index * get_image_idx()
Returns the image node index array.
Index degree(Index domain_node) const
Returns the degree of a domain node.
std::uint64_t Index
Index data type.