115 const Iterator &
begin,
117 const std::function<std::vector<types::global_dof_index>(
118 const Iterator &)> &get_conflict_indices)
121 unsigned int n_iterators = 0;
124 std::unordered_map<types::global_dof_index, std::vector<Iterator>>
125 indices_to_iterators;
126 for (Iterator it =
begin; it !=
end; ++it)
128 const std::vector<types::global_dof_index> conflict_indices =
129 get_conflict_indices(it);
130 const unsigned int n_conflict_indices = conflict_indices.size();
131 for (
unsigned int i = 0; i < n_conflict_indices; ++i)
132 indices_to_iterators[conflict_indices[i]].
push_back(it);
139 std::vector<std::vector<Iterator>> zones(1,
140 std::vector<Iterator>(1,
begin));
141 std::set<Iterator> used_it;
142 used_it.insert(
begin);
143 while (used_it.size() != n_iterators)
148 typename std::vector<Iterator>::iterator previous_zone_it(
149 zones.back().begin());
150 typename std::vector<Iterator>::iterator previous_zone_end(
152 std::vector<Iterator> new_zone;
153 for (; previous_zone_it != previous_zone_end; ++previous_zone_it)
155 const std::vector<types::global_dof_index> conflict_indices =
156 get_conflict_indices(*previous_zone_it);
158 const unsigned int n_conflict_indices(conflict_indices.size());
159 for (
unsigned int i = 0; i < n_conflict_indices; ++i)
161 const std::vector<Iterator> &conflicting_elements =
162 indices_to_iterators[conflict_indices[i]];
163 for (
unsigned int j = 0; j < conflicting_elements.size(); ++j)
171 if ((conflicting_elements[j] != *previous_zone_it) &&
172 (used_it.count(conflicting_elements[j]) == 0))
174 new_zone.push_back(conflicting_elements[j]);
175 used_it.insert(conflicting_elements[j]);
186 if (new_zone.size() != 0)
187 zones.push_back(new_zone);
189 for (Iterator it =
begin; it !=
end; ++it)
190 if (used_it.count(it) == 0)
192 zones.push_back(std::vector<Iterator>(1, it));
228 std::vector<Iterator> &partition,
229 const std::function<std::vector<types::global_dof_index>(
230 const Iterator &)> &get_conflict_indices,
231 std::vector<std::vector<Iterator>> &partition_coloring)
233 partition_coloring.clear();
236 const unsigned int partition_size(partition.size());
237 std::vector<unsigned int> sorted_vertices(partition_size);
238 std::vector<int> degrees(partition_size);
239 std::vector<std::vector<types::global_dof_index>> conflict_indices(
241 std::vector<std::vector<unsigned int>> graph(partition_size);
246 for (
unsigned int i = 0; i < partition_size; ++i)
248 conflict_indices[i] = get_conflict_indices(partition[i]);
249 std::sort(conflict_indices[i].
begin(), conflict_indices[i].
end());
254 for (
unsigned int i = 0; i < partition_size; ++i)
255 for (
unsigned int j = i + 1; j < partition_size; ++j)
259 conflict_indices[j]))
263 graph[i].push_back(j);
264 graph[j].push_back(i);
268 std::vector<int>::iterator degrees_it;
269 for (
unsigned int i = 0; i < partition_size; ++i)
272 degrees_it = std::max_element(degrees.begin(), degrees.end());
273 sorted_vertices[i] = degrees_it - degrees.begin();
279 std::vector<std::unordered_set<unsigned int>> colors_used;
280 for (
unsigned int i = 0; i < partition_size; ++i)
282 const unsigned int current_vertex(sorted_vertices[i]);
283 bool new_color(
true);
287 for (
unsigned int j = 0; j < partition_coloring.size(); ++j)
292 bool unused_color(
true);
293 for (
const auto adjacent_vertex : graph[current_vertex])
294 if (colors_used[j].count(adjacent_vertex) == 1)
296 unused_color =
false;
301 partition_coloring[j].push_back(partition[current_vertex]);
302 colors_used[j].insert(current_vertex);
310 partition_coloring.push_back(
311 std::vector<Iterator>(1, partition[current_vertex]));
312 std::unordered_set<unsigned int> tmp;
313 tmp.insert(current_vertex);
314 colors_used.push_back(tmp);
333 const std::vector<std::vector<std::vector<Iterator>>> &partition_coloring)
335 std::vector<std::vector<Iterator>> coloring;
338 const unsigned int partition_size(partition_coloring.size());
339 std::vector<std::vector<unsigned int>> colors_counter(partition_size);
340 for (
unsigned int i = 0; i < partition_size; ++i)
342 const unsigned int n_colors(partition_coloring[i].
size());
343 colors_counter[i].resize(n_colors);
344 for (
unsigned int j = 0; j < n_colors; ++j)
345 colors_counter[i][j] = partition_coloring[i][j].
size();
350 unsigned int i_color(0);
351 unsigned int max_even_n_colors(0);
352 const unsigned int colors_size(colors_counter.size());
353 for (
unsigned int i = 0; i < colors_size; i += 2)
355 if (max_even_n_colors < colors_counter[i].
size())
357 max_even_n_colors = colors_counter[i].size();
361 coloring.resize(max_even_n_colors);
362 for (
unsigned int j = 0; j < colors_counter[i_color].size(); ++j)
363 coloring[j] = partition_coloring[i_color][j];
365 for (
unsigned int i = 0; i < partition_size; i += 2)
369 std::unordered_set<unsigned int> used_k;
370 for (
unsigned int j = 0; j < colors_counter[i].size(); ++j)
374 std::vector<unsigned int>::iterator it;
375 it = std::max_element(colors_counter[i].
begin(),
376 colors_counter[i].
end());
377 unsigned int min_iterators(
static_cast<unsigned int>(-1));
381 for (
unsigned int k = 0; k < max_even_n_colors; ++k)
382 if (used_k.count(k) == 0)
383 if (colors_counter[i_color][k] < min_iterators)
385 min_iterators = colors_counter[i_color][k];
388 colors_counter[i_color][pos] += *it;
390 coloring[pos].insert(
392 partition_coloring[i][it - colors_counter[i].
begin()]
394 partition_coloring[i][it - colors_counter[i].
begin()]
405 if (partition_size > 1)
407 unsigned int max_odd_n_colors(0);
408 for (
unsigned int i = 1; i < partition_size; i += 2)
410 if (max_odd_n_colors < colors_counter[i].
size())
412 max_odd_n_colors = colors_counter[i].size();
416 coloring.resize(max_even_n_colors + max_odd_n_colors);
417 for (
unsigned int j = 0; j < colors_counter[i_color].size(); ++j)
418 coloring[max_even_n_colors + j] = partition_coloring[i_color][j];
420 for (
unsigned int i = 1; i < partition_size; i += 2)
424 std::unordered_set<unsigned int> used_k;
425 for (
unsigned int j = 0; j < colors_counter[i].size(); ++j)
429 std::vector<unsigned int>::iterator it;
430 it = std::max_element(colors_counter[i].
begin(),
431 colors_counter[i].
end());
432 unsigned int min_iterators(
static_cast<unsigned int>(-1));
436 for (
unsigned int k = 0; k < max_odd_n_colors; ++k)
437 if (used_k.count(k) == 0)
438 if (colors_counter[i_color][k] < min_iterators)
440 min_iterators = colors_counter[i_color][k];
443 colors_counter[i_color][pos] += *it;
446 coloring[max_even_n_colors + pos].insert(
447 coloring[max_even_n_colors + pos].
end(),
448 partition_coloring[i][it - colors_counter[i].
begin()]
450 partition_coloring[i][it - colors_counter[i].
begin()]