5#ifndef DEJAVU_COMPONENTS_H
6#define DEJAVU_COMPONENTS_H
24 static int quotient_components(
sgraph *g,
int* colmap,
ds::worklist *vertex_to_component) {
33 int current_component = 0;
36 bool one_component =
false;
38 for(
int i = 0; i < g->
v_size; ++i) {
39 if(handled.
get(i))
continue;
44 int current_component_size = 0;
47 if(current_component_size + wl.
size() == g->
v_size) {
55 const int col_sz = c.
ptn[col] + 1;
58 (*vertex_to_component)[k] = -1;
62 (*vertex_to_component)[k] = current_component;
63 ++current_component_size;
65 if(in_handle == g->
v_size)
continue;
67 const int deg = g->
d[k];
68 const int vpt = g->
v[k];
69 for (
int j = vpt; j < vpt + deg; ++j) {
70 const int neighbour = g->
e[j];
71 if(!handled.
get(neighbour)) {
73 handled.
set(neighbour);
77 if(!col_handled.
get(col)) {
79 for (
int j = col; j < col + col_sz; ++j) {
80 const int neighbour = c.
lab[j];
81 if (!handled.
get(neighbour)) {
83 handled.
set(neighbour);
90 total_size += current_component_size;
92 if(current_component_size > 0) {
96 if(total_size == g->
v_size || one_component)
break;
100 for(
int i = 0; i < g->
v_size; ++i) (*vertex_to_component)[i] = 0;
103 return current_component;
111 int num_components = 0;
112 std::vector<sgraph> components_graph;
113 std::vector<int*> components_coloring;
114 std::vector<int> backward_translation;
115 std::vector<int> component_to_backward_translation;
127 dej_assert(component_to_backward_translation[component] + vertex <
128 static_cast<int>(backward_translation.size()));
129 return (num_components <= 1? vertex :
130 backward_translation[component_to_backward_translation[component] + vertex]);
144 num_components = new_num_components;
145 if(num_components <= 1)
return;
147 std::vector<int> vertices_in_component;
148 vertices_in_component.resize(num_components);
150 std::vector<int> forward_translation;
151 forward_translation.resize(g->
v_size);
153 int backward_size = 0;
155 for(
int v = 0; v < g->
v_size; ++v) {
156 const int component = vertex_to_component[v];
158 forward_translation[v] = -1;
161 const int v_in_component = vertices_in_component[component];
162 ++vertices_in_component[component];
164 forward_translation[v] = v_in_component;
167 backward_translation.
resize(backward_size);
168 component_to_backward_translation.reserve(num_components);
171 for(
int i = 0; i < num_components; ++i) {
172 const int component_size = vertices_in_component[i];
173 component_to_backward_translation.push_back(current_pos);
174 current_pos += component_size;
177 for(
int v = 0; v < g->
v_size; ++v) {
178 const int component = vertex_to_component[v];
179 if(component < 0)
continue;
180 const int v_in_component = forward_translation[v];
182 dej_assert(v_in_component < vertices_in_component[component]);
183 backward_translation[component_to_backward_translation[component] + v_in_component] = v;
186 for(
int v = 0; v < g->
v_size; ++v) {
187 const int deg = g->
d[v];
188 const int vpt = g->
v[v];
190 for (
int j = vpt; j < vpt + deg; ++j) {
191 const int neighbour = g->
e[j];
192 const int fwd_neighbour = forward_translation[neighbour];
193 if(fwd_neighbour >= 0) {
194 g->
e[ept] = fwd_neighbour;
195 dej_assert(vertex_to_component[v] == vertex_to_component[neighbour]);
202 std::vector<int> original_v;
203 std::vector<int> original_d;
204 original_v.reserve(g->
v_size);
205 original_d.reserve(g->
v_size);
206 for(
int v = 0; v < g->
v_size; ++v) original_v.push_back(g->
v[v]);
207 for(
int v = 0; v < g->
v_size; ++v) original_d.push_back(g->
d[v]);
209 for(
int v = 0; v < g->
v_size; ++v) {
210 const int component = vertex_to_component[v];
211 if(component < 0)
continue;
212 const int v_in_component = forward_translation[v];
213 const int bw_translate = component_to_backward_translation[component];
214 g->
v[bw_translate + v_in_component] = original_v[v];
215 g->
d[bw_translate + v_in_component] = original_d[v];
218 for(
int v = 0; v < g->
v_size; ++v) original_v[v] = colmap[v];
220 components_graph.reserve(num_components);
221 for(
int i = 0; i < num_components; ++i) {
222 const int bw_translate = component_to_backward_translation[i];
223 components_graph.emplace_back();
224 sgraph* component_i = &components_graph[components_graph.size() - 1];
225 component_i->
v_size = vertices_in_component[i];
227 component_i->
v = g->
v + bw_translate;
228 component_i->
d = g->
d + bw_translate;
229 component_i->
e = g->
e;
232 for(
int j = 0; j < vertices_in_component[i]; ++j) {
233 colmap[bw_translate + j] = original_v[backward_translation[bw_translate + j]];
235 components_coloring.push_back(colmap + bw_translate);
247 return &components_graph[i];
257 return components_coloring[i];
Vertex coloring for a graph.
Set specialized for quick resets.
dej_nodiscard bool empty() const
void resize(const int size)
dej_nodiscard int size() const
Decomposes graphs and manages decomposition information.
sgraph * get_component(int i)
int map_back(int component, int vertex)
void decompose(sgraph *g, int *colmap, ds::worklist &vertex_to_component, int new_num_components)
Internal graph data structure.
void initialize_coloring(ds::coloring *c, int *vertex_to_col)