public SalsaResponse pickTopNodes()

in graphjet-core/src/main/java/com/twitter/graphjet/algorithms/salsa/SalsaSelectResults.java [66:124]


  public SalsaResponse pickTopNodes() {
    int maxNumResults = Math.min(salsaInternalState.getSalsaRequest().getMaxNumResults(),
      RecommendationRequest.MAX_RECOMMENDATION_RESULTS);
    PriorityQueue<NodeInfo> topResults = new PriorityQueue<NodeInfo>(maxNumResults);

    int numFilteredNodes = 0;
    for (NodeInfo nodeInfo : salsaInternalState.getVisitedRightNodes().values()) {
      if (salsaInternalState.getSalsaRequest().filterResult(
        nodeInfo.getNodeId(),
        nodeInfo.getSocialProofs())
      ) {
        numFilteredNodes++;
        continue;
      }
      nodeInfo.setWeight(
          nodeInfo.getWeight() / salsaInternalState.getSalsaStats().getNumRHSVisits());
      addResultToPriorityQueue(topResults, nodeInfo, maxNumResults);
    }

    List<RecommendationInfo> outputResults =
        Lists.newArrayListWithCapacity(topResults.size());

    byte[] validSocialProofs = salsaInternalState.getSalsaRequest().getSocialProofTypes();

    while (!topResults.isEmpty()) {
      NodeInfo nodeInfo = topResults.poll();
      outputResults.add(
        new TweetRecommendationInfo(
          TWEET_ID_MASK.restore(nodeInfo.getNodeId()),
          nodeInfo.getWeight(),
          pickTopSocialProofs(nodeInfo.getSocialProofs(), validSocialProofs)));
    }
    Collections.reverse(outputResults);

    salsaStats.setNumRightNodesFiltered(numFilteredNodes);
    salsaStats.setNumRightNodesReached(salsaInternalState.getVisitedRightNodes().size());

    LOG.info("SALSA: after running iterations for request_id = "
        + salsaInternalState.getSalsaRequest().getQueryNode()
        + ", we get numSeedNodes = "
        + salsaStats.getNumSeedNodes()
        + ", numDirectNeighbors = "
        + salsaStats.getNumDirectNeighbors()
        + ", numRHSVisits = "
        + salsaStats.getNumRHSVisits()
        + ", numRightNodesReached = "
        + salsaStats.getNumRightNodesReached()
        + ", numRightNodesFiltered = "
        + salsaStats.getNumRightNodesFiltered()
        + ", minVisitsPerRightNode = "
        + salsaStats.getMinVisitsPerRightNode()
        + ", maxVisitsPerRightNode = "
        + salsaStats.getMaxVisitsPerRightNode()
        + ", numOutputResults = "
        + outputResults.size()
    );

    return new SalsaResponse(outputResults, salsaStats);
  }