114 const Iterator &
begin,
116 const std::function<std::vector<types::global_dof_index>(
117 const Iterator &)> &get_conflict_indices)
120 unsigned int n_iterators = 0;
123 std::unordered_map<types::global_dof_index, std::vector<Iterator>>
124 indices_to_iterators;
125 for (Iterator it =
begin; it !=
end; ++it)
127 const std::vector<types::global_dof_index> conflict_indices =
128 get_conflict_indices(it);
129 const unsigned int n_conflict_indices = conflict_indices.size();
130 for (
unsigned int i = 0; i < n_conflict_indices; ++i)
131 indices_to_iterators[conflict_indices[i]].
push_back(it);
138 std::vector<std::vector<Iterator>> zones(1,
139 std::vector<Iterator>(1,
begin));
140 std::set<Iterator> used_it;
141 used_it.insert(
begin);
142 while (used_it.size() != n_iterators)
147 typename std::vector<Iterator>::iterator previous_zone_it(
148 zones.back().begin());
149 typename std::vector<Iterator>::iterator previous_zone_end(
151 std::vector<Iterator> new_zone;
152 for (; previous_zone_it != previous_zone_end; ++previous_zone_it)
154 const std::vector<types::global_dof_index> conflict_indices =
155 get_conflict_indices(*previous_zone_it);
157 const unsigned int n_conflict_indices(conflict_indices.size());
158 for (
unsigned int i = 0; i < n_conflict_indices; ++i)
160 const std::vector<Iterator> &conflicting_elements =
161 indices_to_iterators[conflict_indices[i]];
162 for (
unsigned int j = 0; j < conflicting_elements.size(); ++j)
170 if ((conflicting_elements[j] != *previous_zone_it) &&
171 (used_it.count(conflicting_elements[j]) == 0))
173 new_zone.push_back(conflicting_elements[j]);
174 used_it.insert(conflicting_elements[j]);
185 if (new_zone.size() != 0)
186 zones.push_back(new_zone);
188 for (Iterator it =
begin; it !=
end; ++it)
189 if (used_it.count(it) == 0)
191 zones.push_back(std::vector<Iterator>(1, it));
227 std::vector<Iterator> &partition,
228 const std::function<std::vector<types::global_dof_index>(
229 const Iterator &)> &get_conflict_indices,
230 std::vector<std::vector<Iterator>> &partition_coloring)
232 partition_coloring.clear();
235 const unsigned int partition_size(partition.size());
236 std::vector<unsigned int> sorted_vertices(partition_size);
237 std::vector<int> degrees(partition_size);
238 std::vector<std::vector<types::global_dof_index>> conflict_indices(
240 std::vector<std::vector<unsigned int>> graph(partition_size);
245 for (
unsigned int i = 0; i < partition_size; ++i)
247 conflict_indices[i] = get_conflict_indices(partition[i]);
248 std::sort(conflict_indices[i].
begin(), conflict_indices[i].
end());
253 for (
unsigned int i = 0; i < partition_size; ++i)
254 for (
unsigned int j = i + 1; j < partition_size; ++j)
258 conflict_indices[j]))
262 graph[i].push_back(j);
263 graph[j].push_back(i);
267 std::vector<int>::iterator degrees_it;
268 for (
unsigned int i = 0; i < partition_size; ++i)
271 degrees_it = std::max_element(degrees.begin(), degrees.end());
272 sorted_vertices[i] = degrees_it - degrees.begin();
278 std::vector<std::unordered_set<unsigned int>> colors_used;
279 for (
unsigned int i = 0; i < partition_size; ++i)
281 const unsigned int current_vertex(sorted_vertices[i]);
282 bool new_color(
true);
286 for (
unsigned int j = 0; j < partition_coloring.size(); ++j)
291 bool unused_color(
true);
292 for (
const auto adjacent_vertex : graph[current_vertex])
293 if (colors_used[j].count(adjacent_vertex) == 1)
295 unused_color =
false;
300 partition_coloring[j].push_back(partition[current_vertex]);
301 colors_used[j].insert(current_vertex);
309 partition_coloring.push_back(
310 std::vector<Iterator>(1, partition[current_vertex]));
311 std::unordered_set<unsigned int> tmp;
312 tmp.insert(current_vertex);
313 colors_used.push_back(tmp);
332 const std::vector<std::vector<std::vector<Iterator>>> &partition_coloring)
334 std::vector<std::vector<Iterator>> coloring;
337 const unsigned int partition_size(partition_coloring.size());
338 std::vector<std::vector<unsigned int>> colors_counter(partition_size);
339 for (
unsigned int i = 0; i < partition_size; ++i)
341 const unsigned int n_colors(partition_coloring[i].
size());
342 colors_counter[i].resize(n_colors);
343 for (
unsigned int j = 0; j < n_colors; ++j)
344 colors_counter[i][j] = partition_coloring[i][j].
size();
349 unsigned int i_color(0);
350 unsigned int max_even_n_colors(0);
351 const unsigned int colors_size(colors_counter.size());
352 for (
unsigned int i = 0; i < colors_size; i += 2)
354 if (max_even_n_colors < colors_counter[i].
size())
356 max_even_n_colors = colors_counter[i].size();
360 coloring.resize(max_even_n_colors);
361 for (
unsigned int j = 0; j < colors_counter[i_color].size(); ++j)
362 coloring[j] = partition_coloring[i_color][j];
364 for (
unsigned int i = 0; i < partition_size; i += 2)
368 std::unordered_set<unsigned int> used_k;
369 for (
unsigned int j = 0; j < colors_counter[i].size(); ++j)
373 std::vector<unsigned int>::iterator it;
374 it = std::max_element(colors_counter[i].
begin(),
375 colors_counter[i].
end());
376 unsigned int min_iterators(
static_cast<unsigned int>(-1));
380 for (
unsigned int k = 0; k < max_even_n_colors; ++k)
381 if (used_k.count(k) == 0)
382 if (colors_counter[i_color][k] < min_iterators)
384 min_iterators = colors_counter[i_color][k];
387 colors_counter[i_color][pos] += *it;
389 coloring[pos].insert(
391 partition_coloring[i][it - colors_counter[i].
begin()]
393 partition_coloring[i][it - colors_counter[i].
begin()]
404 if (partition_size > 1)
406 unsigned int max_odd_n_colors(0);
407 for (
unsigned int i = 1; i < partition_size; i += 2)
409 if (max_odd_n_colors < colors_counter[i].
size())
411 max_odd_n_colors = colors_counter[i].size();
415 coloring.resize(max_even_n_colors + max_odd_n_colors);
416 for (
unsigned int j = 0; j < colors_counter[i_color].size(); ++j)
417 coloring[max_even_n_colors + j] = partition_coloring[i_color][j];
419 for (
unsigned int i = 1; i < partition_size; i += 2)
423 std::unordered_set<unsigned int> used_k;
424 for (
unsigned int j = 0; j < colors_counter[i].size(); ++j)
428 std::vector<unsigned int>::iterator it;
429 it = std::max_element(colors_counter[i].
begin(),
430 colors_counter[i].
end());
431 unsigned int min_iterators(
static_cast<unsigned int>(-1));
435 for (
unsigned int k = 0; k < max_odd_n_colors; ++k)
436 if (used_k.count(k) == 0)
437 if (colors_counter[i_color][k] < min_iterators)
439 min_iterators = colors_counter[i_color][k];
442 colors_counter[i_color][pos] += *it;
445 coloring[max_even_n_colors + pos].insert(
446 coloring[max_even_n_colors + pos].
end(),
447 partition_coloring[i][it - colors_counter[i].
begin()]
449 partition_coloring[i][it - colors_counter[i].
begin()]