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);
}
}
}
}
}