private int initMaps(BipartiteGraph<L, R> graph) { List<L> verticesL = graph.getLeftVertices(); rToLMap = new HashMap<String, Set<String>>(graph.getRightVertices().size()); qVerticesMap = new HashMap<String, CoverVertex<L, R>>(verticesL.size()); int maxAdjCount = 0; for (L vertex : verticesL) { CoverVertex<L, R> qv = new CoverVertex<L, R>(vertex, graph); qVerticesMap.put(vertex.getLabel(), qv); Set<String> adjRLabels = qv.getAdjRLabels(); for (String rLabel : adjRLabels) { Set<String> adjLLabels = rToLMap.get(rLabel); if (adjLLabels == null) { adjLLabels = new HashSet<String>(); rToLMap.put(rLabel, adjLLabels); } adjLLabels.add(vertex.getLabel()); } maxAdjCount = Math.max(maxAdjCount, adjRLabels.size()); } return maxAdjCount; }
private void addRemainingSetCoverVertices(List<L> setCover) { for (int i = adjCounts.length - 1; i >= 0; i--) { List<String> qvWithAdjCount = adjCounts[i]; // if there are no vertices with this adjacency count go to the next iteration if (qvWithAdjCount == null || qvWithAdjCount.size() == 0) continue; // This is where we resolve ties. // getBestVertex will also sort so that the best vertex is at index 0. String lLabel = getBestVertex(qvWithAdjCount); // String lLabel = qvWithAdjCount.get(0); qvWithAdjCount.remove(0); // add this to the set cover CoverVertex<L, R> qv = qVerticesMap.get(lLabel); setCover.add(qv.getVertex()); // get all the labels of all vertices adjacent to this vertex // and remove them from the graph. for (String rLabel : qv.getAdjRLabels()) { Set<String> lLabels = rToLMap.get(rLabel); // other L vertices adjacent to this R vertex for (String label : lLabels) { CoverVertex<L, R> qvl = qVerticesMap.get(label); if (qvl == qv) continue; removeAdjacentVertx(qvl, rLabel); } } if (qvWithAdjCount.size() > 0) i++; } }
private void initUniqAdjacencyCounts() { for (CoverVertex<L, R> qv : qVerticesMap.values()) { Set<String> adjR = qv.getAdjRLabels(); int uniqCount = 0; for (String r : adjR) { if (rToLMap.get(r).size() == 1) { uniqCount++; } } qv.setUniqAdjacentcount(uniqCount); } }
private void addVerticesWithUniqAdjacent(List<L> setCover) { Iterator<CoverVertex<L, R>> iter = qVerticesMap.values().iterator(); while (iter.hasNext()) { CoverVertex<L, R> qv = iter.next(); if (qv.getUniqAdjacentcount() > 0) { setCover.add(qv.getVertex()); } } // remove the vertices already added (and their adjacent vertices) from the graph for (L v : setCover) { CoverVertex<L, R> qv = qVerticesMap.get(v.getLabel()); // get all the labels of all vertices adjacent to this vertex // and remove them from the graph. for (String rLabel : qv.getAdjRLabels()) { Set<String> lLabels = rToLMap.get(rLabel); // other L vertices adjacent to this R vertex for (String label : lLabels) { CoverVertex<L, R> qvl = qVerticesMap.get(label); if (qvl == qv) continue; removeAdjacentVertx(qvl, rLabel); } } } // remove these vertices from the adjacency count list // This should be done AFTER the previous step (removing all R vertices for vertices in set // cover // and updating L vertices that matched to them). for (L v : setCover) { CoverVertex<L, R> qv = qVerticesMap.get(v.getLabel()); List<String> qvWithAdjCount = adjCounts[qv.getAdjacentCount()]; Iterator<String> iterL = qvWithAdjCount.iterator(); boolean removed = false; while (iterL.hasNext()) { String label = iterL.next(); if (label.equals(qv.getVertex().getLabel())) { iterL.remove(); removed = true; break; } } if (!removed) throw new IllegalArgumentException("Vertex not removed; " + qv.getVertex().getLabel()); } }