Example #1
0
  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;
  }
Example #2
0
  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++;
    }
  }
Example #3
0
 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);
   }
 }
Example #4
0
  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());
    }
  }