private void collectRecommendations()

in graphjet-core/src/main/java/com/twitter/graphjet/algorithms/socialproof/NodeMetadataSocialProofGenerator.java [148:186]


  private void collectRecommendations(NodeMetadataSocialProofRequest request) {
    Byte2ObjectMap<IntSet> inputNodeMetadataTypeToIdsMap = request.getNodeMetadataTypeToIdsMap();
    ByteSet socialProofTypes = new ByteArraySet(request.getSocialProofTypes());

    // Iterate through the set of seed users with weights.
    for (Long2DoubleMap.Entry seedWithWeight: request.getLeftSeedNodesWithWeight().long2DoubleEntrySet()) {
      long leftNode = seedWithWeight.getLongKey();
      double weight = seedWithWeight.getDoubleValue();
      NodeMetadataMultiSegmentIterator edgeIterator =
        (NodeMetadataMultiSegmentIterator) graph.getLeftNodeEdges(leftNode);
      if (edgeIterator == null) continue;

      // For each seed user node, we traverse all of its outgoing edges, up to the MAX_EDGES_PER_NODE.
      int numEdgePerNode = 0;
      while (edgeIterator.hasNext() && numEdgePerNode++ < MAX_EDGES_PER_NODE) {
        long rightNode = idMask.restore(edgeIterator.nextLong());
        byte edgeType = edgeIterator.currentEdgeType();
        if (!socialProofTypes.contains(edgeType)) continue;

        // For each of the accepted edges, we traverse the metadata ids for all of the specified node
        // metadata types in the request.
        for (byte nodeMetadataType: request.getNodeMetadataTypeToIdsMap().keySet()) {
          IntSet inputNodeMetadataIds = inputNodeMetadataTypeToIdsMap.get(nodeMetadataType);
          IntArrayIterator metadataIterator =
            (IntArrayIterator) edgeIterator.getRightNodeMetadata(nodeMetadataType);
          if (metadataIterator == null) continue;

          while (metadataIterator.hasNext()) {
            int metadataId = metadataIterator.nextInt();
            // If the current id is in the set of inputNodeMetadataIds,
            // we find and store its social proof.
            if (!inputNodeMetadataIds.contains(metadataId)) continue;
            addSocialProof(nodeMetadataType, metadataId, edgeType, leftNode, rightNode);
            addSocialProofWeight(nodeMetadataType, metadataId, weight);
          }
        }
      }
    }
  }