public static int getNumOfCols(GraphModel g) { int res = 0; for (Vertex v : g) { if (v.getColor() > res) res = v.getColor(); } return res; }
public MapFileReader(String path) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File(path.replace(".data", ".xml"))); NodeList nList = document.getElementsByTagName("map"); background = ((Element) nList.item(0)).getElementsByTagName("File").item(0).getTextContent(); nList = document.getElementsByTagName("vertex"); GraphModel g2 = new GraphModel(false); g2.setAllowLoops(true); Vertex root = new Vertex(); root.setLocation(new GraphPoint(0, 0)); g2.addVertex(root); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; boolean isRoot = eElement.getAttribute("type").equals("root"); String id = eElement.getAttribute("id"); int x = Integer.parseInt(eElement.getElementsByTagName("x").item(0).getTextContent()); int y = Integer.parseInt(eElement.getElementsByTagName("y").item(0).getTextContent()); int value = 0; Vertex newVertex = new Vertex(); newVertex.setLocation(new GraphPoint(x, y)); newVertex.setLabel(id); if (!isRoot) { g2.addVertex(newVertex); value = Integer.parseInt(eElement.getElementsByTagName("value").item(0).getTextContent()); Edge e = new Edge(newVertex, root); e.setWeight(value); g2.addEdge(e); } else { root.setLocation(newVertex.getLocation()); root.setLabel(newVertex.getLabel()); // root = newVertex; } } } this.setGraph(g2); } catch (DOMException | ParserConfigurationException | SAXException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
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 StarBicoloringDynamicOrderingRestricted( 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) { if (g.getEdge(g.getVertex(v), w).getWeight() == 1 || g.getEdge(x, w).getWeight() == 1) { forbiddenColors.set(x.getColor(), v); } } } } else { for (Vertex x : g.getNeighbors(w)) { 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; }
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; }
public static boolean StarBicoloring(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 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()); } 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 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; }