in cr-mixer/server/src/main/scala/com/twitter/cr_mixer/candidate_generation/AdsCandidateSourcesRouter.scala [87:248]
def fetchCandidates(
requestUserId: UserId,
sourceSignals: Set[SourceInfo],
realGraphSeeds: Map[UserId, Double],
params: configapi.Params
): Future[Seq[Seq[InitialAdsCandidate]]] = {
val simClustersANN1ConfigId = params(SimClustersANNParams.SimClustersANN1ConfigId)
val tweetBasedSANNMinScore = params(
TweetBasedCandidateGenerationParams.SimClustersMinScoreParam)
val tweetBasedSANN1Candidates =
if (params(TweetBasedCandidateGenerationParams.EnableSimClustersANN1Param)) {
Future.collect(
CandidateSourcesRouter.getTweetBasedSourceInfo(sourceSignals).toSeq.map { sourceInfo =>
getSimClustersANNCandidates(
requestUserId,
Some(sourceInfo),
params,
simClustersANN1ConfigId,
tweetBasedSANNMinScore)
})
} else Future.value(Seq.empty)
val simClustersANN2ConfigId = params(SimClustersANNParams.SimClustersANN2ConfigId)
val tweetBasedSANN2Candidates =
if (params(TweetBasedCandidateGenerationParams.EnableSimClustersANN2Param)) {
Future.collect(
CandidateSourcesRouter.getTweetBasedSourceInfo(sourceSignals).toSeq.map { sourceInfo =>
getSimClustersANNCandidates(
requestUserId,
Some(sourceInfo),
params,
simClustersANN2ConfigId,
tweetBasedSANNMinScore)
})
} else Future.value(Seq.empty)
val tweetBasedUagCandidates =
if (params(TweetBasedCandidateGenerationParams.EnableUAGParam)) {
Future.collect(
CandidateSourcesRouter.getTweetBasedSourceInfo(sourceSignals).toSeq.map { sourceInfo =>
getTweetBasedUserAdGraphCandidates(Some(sourceInfo), params)
})
} else Future.value(Seq.empty)
val realGraphInNetworkBasedUagCandidates =
if (params(ConsumersBasedUserAdGraphParams.EnableSourceParam)) {
getRealGraphConsumersBasedUserAdGraphCandidates(realGraphSeeds, params).map(Seq(_))
} else Future.value(Seq.empty)
val producerBasedUagCandidates =
if (params(ProducerBasedCandidateGenerationParams.EnableUAGParam)) {
Future.collect(
CandidateSourcesRouter.getProducerBasedSourceInfo(sourceSignals).toSeq.map { sourceInfo =>
getProducerBasedUserAdGraphCandidates(Some(sourceInfo), params)
})
} else Future.value(Seq.empty)
val tweetBasedTwhinAdsCandidates =
if (params(TweetBasedCandidateGenerationParams.EnableTwHINParam)) {
Future.collect(
CandidateSourcesRouter.getTweetBasedSourceInfo(sourceSignals).toSeq.map { sourceInfo =>
getTwHINAdsCandidates(
tweetBasedTwHINANNSimilarityEngine,
SimilarityEngineType.TweetBasedTwHINANN,
requestUserId,
Some(sourceInfo),
ModelConfig.DebuggerDemo)
})
} else Future.value(Seq.empty)
val producerBasedSANNMinScore = params(
ProducerBasedCandidateGenerationParams.SimClustersMinScoreParam)
val producerBasedSANN1Candidates =
if (params(ProducerBasedCandidateGenerationParams.EnableSimClustersANN1Param)) {
Future.collect(
CandidateSourcesRouter.getProducerBasedSourceInfo(sourceSignals).toSeq.map { sourceInfo =>
getSimClustersANNCandidates(
requestUserId,
Some(sourceInfo),
params,
simClustersANN1ConfigId,
producerBasedSANNMinScore)
})
} else Future.value(Seq.empty)
val producerBasedSANN2Candidates =
if (params(ProducerBasedCandidateGenerationParams.EnableSimClustersANN2Param)) {
Future.collect(
CandidateSourcesRouter.getProducerBasedSourceInfo(sourceSignals).toSeq.map { sourceInfo =>
getSimClustersANNCandidates(
requestUserId,
Some(sourceInfo),
params,
simClustersANN2ConfigId,
producerBasedSANNMinScore)
})
} else Future.value(Seq.empty)
val interestedInMinScore = params(InterestedInParams.MinScoreParam)
val interestedInSANN1Candidates = if (params(InterestedInParams.EnableSimClustersANN1Param)) {
getSimClustersANNCandidates(
requestUserId,
None,
params,
simClustersANN1ConfigId,
interestedInMinScore).map(Seq(_))
} else Future.value(Seq.empty)
val interestedInSANN2Candidates = if (params(InterestedInParams.EnableSimClustersANN2Param)) {
getSimClustersANNCandidates(
requestUserId,
None,
params,
simClustersANN2ConfigId,
interestedInMinScore).map(Seq(_))
} else Future.value(Seq.empty)
val consumerTwHINAdsCandidates =
if (params(ConsumerEmbeddingBasedCandidateGenerationParams.EnableTwHINParam)) {
getTwHINAdsCandidates(
consumerTwHINANNSimilarityEngine,
SimilarityEngineType.ConsumerEmbeddingBasedTwHINANN,
requestUserId,
None,
ModelConfig.DebuggerDemo).map(Seq(_))
} else Future.value(Seq.empty)
val consumerBasedWalsCandidates =
if (params(
ConsumerBasedWalsParams.EnableSourceParam
)) {
getConsumerBasedWalsCandidates(sourceSignals, params)
}.map {
Seq(_)
}
else Future.value(Seq.empty)
Future
.collect(Seq(
tweetBasedSANN1Candidates,
tweetBasedSANN2Candidates,
tweetBasedUagCandidates,
tweetBasedTwhinAdsCandidates,
producerBasedUagCandidates,
producerBasedSANN1Candidates,
producerBasedSANN2Candidates,
realGraphInNetworkBasedUagCandidates,
interestedInSANN1Candidates,
interestedInSANN2Candidates,
consumerTwHINAdsCandidates,
consumerBasedWalsCandidates,
)).map(_.flatten).map { tweetsWithCGInfoSeq =>
Future.collect(
tweetsWithCGInfoSeq.map(candidates => convertToInitialCandidates(candidates, stats)))
}.flatten.map { candidatesLists =>
val result = candidatesLists.filter(_.nonEmpty)
stats.stat("numOfSequences").add(result.size)
stats.stat("flattenCandidatesWithDup").add(result.flatten.size)
result
}
}