/** * Compute a distance-2 coloring of a bipartite graph G_b restricted to required edges * * <p>Input: - G_b bipartite graph with required egdes given as weights edge_weight - V contained * vertices are colored in the given ordering v_1, ..., v_n * * <p>Output: - G_b bipartite graph with colors as weights vertex_color */ public static int PartialD2ColoringRestricted(GraphModel g, Vector<Integer> V) { Vector<Integer> N2 = new Vector<>(); Vector<Integer> forbidden = new Vector<>(g.numOfVertices()); for (int i = 0; i < g.numOfVertices(); i++) forbidden.add(-1); for (int v : V) g.getVertex(v).setColor(0); for (int v : V) { forbidden.set(0, v); if (IncidentToReqEdge(g, v)) { N2 = Neighbors.N_2_restricted(g, v); for (int n2 : N2) { if (g.getVertex(n2).getColor() > 0) { forbidden.set(g.getVertex(n2).getColor(), v); } } for (int i = 0; i < forbidden.size(); i++) { if (forbidden.get(i) != v) { g.getVertex(v).setColor(i); break; } } } else { g.getVertex(v).setColor(0); } } return getNumOfCols(g); }
public static boolean StarBicoloringDynamicOrdering( GraphModel g, Vector<Integer> V_r, Vector<Integer> V_c, int Ordering) { Vector<Integer> forbiddenColors = new Vector<>(V_r.size()); for (int i = 0; i < V_r.size(); i++) forbiddenColors.add(-1); Vector<Integer> Vertices = new Vector<>(V_r.size() + V_c.size()); // GraphModel gg = g.getCopy(); for (int i = 0; i < V_r.size(); i++) { Vertices.add(g.getVertex(i).getId()); } for (int i = 0; i < V_c.size(); i++) { Vertices.add(g.getVertex(i).getId()); } if (Ordering != 0) { if (Ordering == 1) { Vertices = OrderingHeuristics.LFO(g, Vertices); } if (Ordering == 2) { Vertices = OrderingHeuristics.SLO(g, Vertices); } if (Ordering == 3) { Vertices = OrderingHeuristics.IDO(g, Vertices); } } for (int v : Vertices) { if (g.getVertex(v).getColor() != 0) { forbiddenColors.set(0, v); for (Vertex w : g.getNeighbors(g.getVertex(v))) { if (w.getColor() <= 0) { for (Vertex x : g.getNeighbors(w)) { if (x.getColor() > 0) forbiddenColors.set(x.getColor(), v); } } else { for (Vertex x : g.getNeighbors(w)) { if (x.getColor() > 0) { for (Vertex y : g.getNeighbors(x)) { if (y.getColor() > 0) { if (w.getColor() == y.getColor() && w.getId() != y.getId()) { forbiddenColors.set(x.getColor(), v); } } } } } } } } for (int i = 0; i < forbiddenColors.size(); i++) { if (forbiddenColors.get(i) != v) g.getVertex(v).setColor(i); } } return true; }
public static boolean StarBicoloringRestricted( GraphModel g, Vector<Integer> V_r, Vector<Integer> V_c) { Vector<Integer> forbiddenColors = new Vector<>(V_r.size()); for (int i = 0; i < V_r.size(); i++) forbiddenColors.add(-1); Vector<Integer> Vertices = new Vector<>(V_r.size() + V_c.size()); // GraphModel gg = g.getCopy(); for (int v_r : V_r) Vertices.add(v_r); for (int v_c : V_c) Vertices.add(v_c); for (int v : Vertices) { if (g.getVertex(v).getColor() != 0) { forbiddenColors.set(0, v); for (Vertex w : g.getNeighbors(g.getVertex(v))) { if (w.getColor() <= 0) { for (Vertex x : g.getNeighbors(w)) { if (x.getColor() > 0) { if (g.getEdge(x, w).getWeight() == 1 || g.getEdge(w, g.getVertex(v)).getWeight() == 1) { forbiddenColors.set(x.getColor(), v); } } } } else { for (Vertex x : g.getNeighbors(w)) { System.out.println(" jez " + g.getEdge(x, w).getWeight()); if (g.getEdge(x, w).getWeight() == 1) { if (x.getColor() > 0) { for (Vertex y : g.getNeighbors(x)) { if (y.getColor() > 0) { if (w.getColor() == y.getColor() && w.getId() != y.getId()) { forbiddenColors.set(x.getColor(), v); } } } } } } } } } for (int i = 0; i < forbiddenColors.size(); i++) { if (forbiddenColors.get(i) != v) { g.getVertex(v).setColor(i); } } } return true; }
/** * Compute a star bicoloring of a bipartite graph G_b restricted to the required edges (this * version was implemented for Michael Luelfesmann's diploma thesis) * * <p>Input: - G_b bipartite graph with required egdes given as weights edge_weight - V_r * contained row vertices are colored in the given ordering v_1, ..., v_n - V_c contained column * vertices are colored in the given ordering v_1, ..., v_n - Mode parameter \rho (\rho=Mode/2) - * Mode2 parameter \rho if using independent set algorithm of Coleman (Mode==1) * * <p>Output: - G_b bipartite graph with colors given as weights vertex_color */ public static int StarBicoloringSchemeRestricted( GraphModel g, Vector<Integer> V_r, Vector<Integer> V_c, int Mode, int Mode2) { Vector<Integer> IS = new Vector<>(); // Compute independent set System.out.println("Mode " + Mode); if (Mode == 1) { IS = IndSet.ISetRestricted(g, V_r, V_c, Mode2); // ISet = IS_Coleman(G_b,V_r,V_c); } else if (Mode == 2) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 1.0f); } else if (Mode == 3) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 1.5f); } else if (Mode == 4) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 2); } else if (Mode == 5) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 2.5f); } else if (Mode == 6) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 3.0f); } else if (Mode == 7) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 3.5f); } // Color vertices in independent set with color 0 for (int IS_it : IS) { g.getVertex(IS_it).setColor(0); } // Color all vertices which are not colored StarBicoloringRestricted(g, V_r, V_c); return getNumOfCols(g); }
public Object calculate(GraphModel g) { SubGraph sg = new SubGraph(); MSTPrim mp = new MSTPrim(); double[][] adj = g.getAdjacencyMatrix().getArray(); int[][] adjMatrix = new int[g.getVerticesCount()][g.getVerticesCount()]; for (int i = 0; i < g.getVerticesCount(); i++) { for (int j = 0; j < g.getVerticesCount(); j++) { if (adj[i][j] == 0) adjMatrix[i][j] = 0; else adjMatrix[i][j] = 1; } } int[] parent = mp.prim(adjMatrix); for (int i = 0; i < g.getVerticesCount(); i++) { if (parent[i] != -1) { sg.edges.add(g.getEdge(g.getVertex(i), g.getVertex(parent[i]))); } } return sg; }
public static int StarBicoloringSchemeDynamicOrderingRestricted( GraphModel g, Vector<Integer> V_r, Vector<Integer> V_c, int Mode, int sort, int Mode2) { Vector<Integer> IS = new Vector<>(); Vector<Integer> num_colors = new Vector<>(); // Compute independent set if (Mode == 1) { IS = IndSet.ISetRestricted(g, V_r, V_c, Mode2); // ISet = IS_Coleman(G_b,V_r,V_c); } else if (Mode == 2) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 1.0f); } else if (Mode == 3) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 1.5f); } else if (Mode == 4) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 2); } else if (Mode == 5) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 2.5f); } else if (Mode == 6) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 3.0f); } else if (Mode == 7) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 3.5f); } else if (Mode == 8) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 4.0f); } else if (Mode == 9) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 4.5f); } else if (Mode == 10) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 5.0f); } else if (Mode == 11) { IS = IndSet.ISetVariantRestricted(g, V_r, V_c, 5.5f); } // Color vertices in independent set with color 0 for (int IS_it : IS) { g.getVertex(IS_it).setColor(0); } // Color all vertices which are not colored StarBicoloringDynamicOrderingRestricted(g, V_r, V_c, sort); return getNumOfCols(g); }
public static int StarBicoloringSchemeCombinedVertexCoverColoringRestricted( GraphModel g, final Vector<Integer> V_rr, final Vector<Integer> V_cc, final int Mode) { Vector<Integer> IS = new Vector<>(); Vector<Integer> V_r = new Vector<>(); Vector<Integer> V_c = new Vector<>(); V_r.addAll(V_rr); V_c.addAll(V_cc); Vector<Integer> num_colors; Vector<Integer> V_r_aux = new Vector<>(); Vector<Integer> V_c_aux = new Vector<>(); V_r_aux.addAll(V_r); V_c_aux.addAll(V_c); GraphModel gaux = g.getCopy(); float ratio = 1; if (Mode != 1) ratio = Mode / 2; Vector<Pair<Integer, Integer>> Degree_V_r_aux = new Vector<>(); Vector<Pair<Integer, Integer>> Degree_V_c_aux = new Vector<>(); Vector<Pair<Integer, Integer>> copy_real_r = new Vector<>(); Vector<Pair<Integer, Integer>> copy_real_c = new Vector<>(); Vector<Integer> forbiddenColors = new Vector<>(V_r.size()); for (int i = 0; i < V_r.size(); i++) { forbiddenColors.add(-1); } Iterator<Integer> v_r_aux_it = V_r_aux.iterator(); for (int v_r : V_r) { if (v_r_aux_it.hasNext()) { int v_r_aux = v_r_aux_it.next(); copy_real_r.add(new Pair<>(v_r, v_r_aux)); } } Iterator<Integer> v_c_aux_it = V_c_aux.iterator(); for (int v_c : V_c) { if (v_c_aux_it.hasNext()) { int v_c_aux = v_c_aux_it.next(); copy_real_c.add(new Pair<>(v_c, v_c_aux)); } } for (int v_r : V_r_aux) { Degree_V_r_aux.add(new Pair<>(v_r, gaux.getDegree(gaux.getVertex(v_r)))); } for (int v_c : V_c_aux) { Degree_V_c_aux.add(new Pair<>(v_c, gaux.getDegree(gaux.getVertex(v_c)))); } while (gaux.getEdgesCount() > 0) { int max_degree_V_r_aux = 0; for (Pair<Integer, Integer> di : Degree_V_r_aux) { di.second = gaux.getDegree(gaux.getVertex(di.first)); int degree_v_r = di.second; if (degree_v_r > max_degree_V_r_aux) { max_degree_V_r_aux = degree_v_r; } } System.out.println("1"); int max_degree_V_c_aux = 0; for (Pair<Integer, Integer> di : Degree_V_c_aux) { di.second = gaux.getDegree(gaux.getVertex(di.first)); int degree_v_c = di.second; if (degree_v_c > max_degree_V_c_aux) { max_degree_V_c_aux = degree_v_c; } } System.out.println("2"); if (max_degree_V_r_aux > ratio * max_degree_V_c_aux) { Vector<Pair<Integer, Integer>> removedEdges = new Vector<>(); for (Pair<Integer, Integer> di : Degree_V_r_aux) { if (max_degree_V_r_aux == di.second) { Pair<Integer, Integer> cr = new Pair<>(0, 0); for (Pair<Integer, Integer> crtmp : copy_real_r) { if (crtmp.second.equals(di.first)) { cr = crtmp; break; } } int v = 0; for (int tmp : V_r) { if (cr.first == v) { v = tmp; break; } } System.out.println("33"); IndSet.clearVertex(gaux.getVertex(di.first), gaux); removedEdges.add(di); System.out.println("44"); forbiddenColors.set(0, v); for (Vertex w : g.getNeighbors(g.getVertex(v))) { if (w.getColor() <= 0) { for (Vertex x : g.getNeighbors(w)) { if (x.getColor() > 0) { if (g.getEdge(w, g.getVertex(v)).getWeight() == 1 || g.getEdge(w, x).getWeight() == 1) { forbiddenColors.set(x.getId(), v); } } } } else { // Color[w]>0 for (Vertex x : g.getNeighbors(w)) { if (x.getColor() > 0) { if (g.getEdge(w, x).getWeight() == 1) { for (Vertex y : g.getNeighbors(x)) { if (y.getColor() > 0) { if (w.getColor() == y.getColor() && w.getId() != y.getId()) { forbiddenColors.set(x.getId(), v); } } } } } } } System.out.println("45s"); } System.out.printf("456"); // Find first color which can be assigned to v_c for (int i = 0; i < forbiddenColors.size(); i++) { if (forbiddenColors.get(i) != v) { g.getVertex(v).setColor(forbiddenColors.get(i)); break; } } System.out.println("500"); } } Degree_V_r_aux.removeAll(removedEdges); } else { Vector<Pair<Integer, Integer>> removedEdges = new Vector<>(); for (Pair<Integer, Integer> di : Degree_V_c_aux) { if (max_degree_V_c_aux == di.second) { Pair<Integer, Integer> cr = new Pair<>(0, 0); for (Pair<Integer, Integer> crtmp : copy_real_c) { if (crtmp.second == di.first) { cr = crtmp; break; } } int v = 0; for (int tmp : V_c) { if (cr.first == v) { v = tmp; break; } } IndSet.clearVertex(gaux.getVertex(di.first), gaux); removedEdges.add(di); System.out.println("3"); forbiddenColors.set(0, v); System.out.println("3.0q" + v); for (Vertex w : g.getNeighbors(g.getVertex(v))) { System.out.println("3.1"); if (w.getColor() <= 0) { for (Vertex x : g.getNeighbors(w)) { if (x.getColor() > 0) { if (g.getEdge(w, g.getVertex(v)).getWeight() == 1 || g.getEdge(w, x).getWeight() == 1) { forbiddenColors.set(x.getId(), v); } } } System.out.println("3.2"); } else { // Color[w]>0 for (Vertex x : g.getNeighbors(w)) { System.out.println("3.3"); if (x.getColor() > 0) { if (g.getEdge(w, x).getWeight() == 1) { for (Vertex y : g.getNeighbors(x)) { if (y.getColor() > 0) { if (w.getColor() == y.getColor() && w.getId() != y.getId()) { forbiddenColors.set(x.getId(), v); } } } } } } } } System.out.println("3.5"); // Find first color which can be assigned to v_c for (int i = 0; i < forbiddenColors.size(); i++) { if (forbiddenColors.get(i) != v) { g.getVertex(v).setColor(forbiddenColors.get(i)); break; } } } } System.out.println("4"); Degree_V_c_aux.removeAll(removedEdges); } } for (Pair<Integer, Integer> di : Degree_V_r_aux) { IS.add(di.first); } for (Pair<Integer, Integer> di : Degree_V_c_aux) { IS.add(di.first); } for (int i = 0; i < IS.size(); i++) { g.getVertex(IS.get(i)).setColor(0); } return getNumOfCols(g); }
public static boolean IncidentToReqEdge(GraphModel g, int Vertex) { for (Edge e : g.edges(g.getVertex(Vertex))) if (e.getWeight() == 1) return true; return false; }
public static int color( int Coloring, int Ordering, int Mode, int RequiredPattern, int rho, int blockSize, File file) { int Mode2 = 0; if (Ordering != 0) { if (Coloring == 3) { Ordering += 3; } } if (Mode == 3) { if (rho != 0) { Mode = 2 * rho; } } if (Mode == 0) { if (rho != 0) { Mode2 = 2 * rho; } } Matrix mm = new Matrix(5, 5); try { mm = MM.loadMatrixFromSPARSE(file); } catch (IOException e) { e.printStackTrace(); } int rows = mm.getRowDimension(); int cols = mm.getColumnDimension(); GraphModel g = new GraphModel(false); Vector<Integer> V_r = new Vector<>(); Vector<Integer> V_c = new Vector<>(); for (int i = 0; i < rows; i++) { Vertex v = new Vertex(); v.setColor(-1); g.addVertex(v); V_r.add(v.getId()); } for (int i = 0; i < cols; i++) { Vertex v = new Vertex(); v.setColor(-1); g.addVertex(v); V_c.add(v.getId()); } for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (mm.get(i, j) == 1) { g.addEdge(new Edge(g.getVertex(i), g.getVertex(rows + j))); } } } // new GraphData(Application.getBlackBoard()).core.showGraph(g); // Initialize required pattern int entries_pattern = 0; // If edge e \in E_S then edge_property edge_weight=1 else switch (RequiredPattern) { case 0: break; case 1: for (Edge e : g.getEdges()) { if (Math.abs(e.source.getId() - e.target.getId()) == rows) { e.setWeight(1); entries_pattern++; } } break; case 2: for (Edge e : g.getEdges()) { e.setWeight(1); entries_pattern++; } break; case 3: for (Edge e : g.getEdges()) { int RowCoordinate = e.source.getId() + rows; int ColumnCoordinate = e.target.getId(); int RelativeDistance = RowCoordinate - ColumnCoordinate; int RowBlock = RowCoordinate / blockSize; int ColumnBlock = ColumnCoordinate / blockSize; if ((RelativeDistance < blockSize) && (RelativeDistance > -blockSize) && (RowBlock == ColumnBlock)) { e.setWeight(1); entries_pattern++; } } break; } // Presorting of the vertices if (Coloring == 1 || Coloring == 2 || Coloring == 3 || Coloring == 4 || Coloring == 5 || Coloring == 6) { switch (Ordering) { case 0: break; case 1: if (Coloring == 1) { V_c = OrderingHeuristics.LFO(g, V_c); } else if (Coloring == 2) { V_r = OrderingHeuristics.LFO(g, V_r); } else if (Coloring == 5 || Coloring == 6) { V_r = OrderingHeuristics.LFO(g, V_r); V_c = OrderingHeuristics.LFO(g, V_c); } break; case 2: if (Coloring == 1) { V_c = OrderingHeuristics.SLO(g, V_c); } else if (Coloring == 2) { V_r = OrderingHeuristics.SLO(g, V_r); } else if (Coloring == 5) { V_r = OrderingHeuristics.SLO(g, V_r); V_c = OrderingHeuristics.SLO(g, V_c); } break; case 3: if (Coloring == 1) { V_c = OrderingHeuristics.IDO(g, V_c); } else if (Coloring == 2) { V_r = OrderingHeuristics.IDO(g, V_r); } else if (Coloring == 5) { V_r = OrderingHeuristics.IDO(g, V_r); V_c = OrderingHeuristics.IDO(g, V_c); } break; case 4: if (Coloring == 3) { V_c = OrderingHeuristics.LFOrestricted(g, V_c); } else if (Coloring == 4) { V_r = OrderingHeuristics.LFOrestricted(g, V_r); } else if (Coloring == 6) { V_r = OrderingHeuristics.LFOrestricted(g, V_r); V_c = OrderingHeuristics.LFOrestricted(g, V_c); } break; case 5: if (Coloring == 3) { V_c = OrderingHeuristics.SLOrestricted(g, V_c); } else if (Coloring == 4) { V_r = OrderingHeuristics.SLOrestricted(g, V_r); } else if (Coloring == 6) { V_r = OrderingHeuristics.SLOrestricted(g, V_r); V_c = OrderingHeuristics.SLOrestricted(g, V_c); } break; case 6: if (Coloring == 3) { V_c = OrderingHeuristics.IDOrestricted(g, V_c); } else if (Coloring == 4) { V_r = OrderingHeuristics.IDOrestricted(g, V_r); } else if (Coloring == 6) { V_r = OrderingHeuristics.IDOrestricted(g, V_r); V_c = OrderingHeuristics.IDOrestricted(g, V_c); } break; } } int num_colors = 0; // Coloring of the vertices switch (Coloring) { case 1: System.out.println("PartialD2ColoringCols"); num_colors = ColorAlgs.PartialD2Coloring(g, V_c); break; case 2: System.out.println("PartialD2ColoringRows"); num_colors = ColorAlgs.PartialD2Coloring(g, V_r); break; case 3: System.out.println("PartialD2ColoringRestrictedCols"); num_colors = ColorAlgs.PartialD2ColoringRestricted(g, V_c); break; case 4: System.out.println("PartialD2ColoringRestrictedRows"); num_colors = ColorAlgs.PartialD2ColoringRestricted(g, V_r); break; case 5: System.out.println("StarBicoloringScheme"); num_colors = ColorAlgs.StarBicoloringScheme(g, V_r, V_c, Mode, Mode2); break; case 6: System.out.println("StarBicoloringSchemeRestricted " + V_r.size() + " " + V_c.size()); num_colors = ColorAlgs.StarBicoloringSchemeRestricted(g, V_r, V_c, Mode, Mode2); break; case 7: System.out.println("StarBicoloringSchemeDynamicOrdering"); num_colors = ColorAlgs.StarBicoloringSchemeDynamicOrdering(g, V_r, V_c, Mode, Ordering, Mode2); break; case 8: System.out.println("StarBicoloringSchemeCombinedVertexCoverColoring"); num_colors = ColorAlgs.StarBicoloringSchemeCombinedVertexCoverColoring(g, V_r, V_c, Mode); break; case 9: System.out.println("StarBicoloringSchemeDynamicOrderingRestricted"); num_colors = ColorAlgs.StarBicoloringSchemeDynamicOrderingRestricted( g, V_r, V_c, Mode, Ordering, Mode2); break; case 10: System.out.println("StarBicoloringSchemeCombinedVertexCoverColoringRestricted"); num_colors = ColorAlgs.StarBicoloringSchemeCombinedVertexCoverColoringRestricted(g, V_r, V_c, Mode); break; } return num_colors; }