in fbpcs/emp_games/attribution/decoupled_aggregation/Aggregation.hpp [226:310]
AggregationOutputMetrics computeAggregations(
const AggregationInputMetrics& inputData,
fbpcf::Visibility outputVisibility) {
auto ids = inputData.getIds();
uint32_t numIds = ids.size();
XLOGF(INFO, "Have {} ids", numIds);
// Send over all of the data needed for this computation
XLOG(INFO, "Sharing aggregation formats...");
const auto aggregationFormats =
shareAggregationFormats<MY_ROLE>(inputData.getAggregationFormats());
const auto& adIds = shareValidAdIds<MY_ROLE>(inputData.getOriginalAdIds());
MeasurementTpmArrays privateTpmArrays;
MeasurementCvmArrays privateCvmArrays;
std::vector<std::vector<PrivateAttributionResult>>
privateTpmSecretSharePerRule;
std::vector<std::vector<PrivateAttributionResult>>
privateCvmSecretSharePerRule;
for (const auto& aggregationFormat : aggregationFormats) {
switch (aggregationFormat.id) {
case AGGREGATION_FORMAT::AD_OBJECT_FORMAT:
const auto& measurmentArrays =
populateMetricsForAdObjectFormat<MY_ROLE>(inputData, numIds);
privateTpmArrays = measurmentArrays.first;
privateCvmArrays = measurmentArrays.second;
break;
}
}
PrivateAggregationMetrics aggregationMetrics{
aggregationFormats, AggregationContext{adIds}, outputVisibility};
AggregationOutputMetrics out;
const auto& attributionRules = inputData.getAttributionRules();
const auto& touchpointSecretShares = inputData.getTouchpointSecretShares();
const auto& conversionSecretShares = inputData.getConversionSecretShares();
for (std::vector<std::string>::size_type i = 0; i < attributionRules.size();
i++) {
// share secret shares computed for each attribution Rule
XLOG(INFO, "Sharing touchpoint attribution results...");
std::vector<std::vector<AttributionResult>> tpAttributionResultsPerRule;
std::vector<std::vector<AttributionResult>> cvmAttributionResultsPerRule;
// We will share attribution results per attribution rule.
if (MY_ROLE == PUBLISHER) {
for (const auto& entries : touchpointSecretShares.at(i)) {
std::vector<AttributionResult> results;
for (const auto& entry : entries) {
results.push_back(AttributionResult{entry.isAttributed});
}
tpAttributionResultsPerRule.push_back(results);
}
}
privateTpmSecretSharePerRule =
privatelyShareAttributionResultsTouchpoints<MY_ROLE>(
tpAttributionResultsPerRule, numIds);
XLOG(INFO, "Sharing conversion attribution results...");
if (MY_ROLE == PARTNER) {
for (const auto& entries : conversionSecretShares.at(i)) {
std::vector<AttributionResult> results;
for (const auto& entry : entries) {
results.push_back(AttributionResult{entry.isAttributed});
}
cvmAttributionResultsPerRule.push_back(results);
}
}
privateCvmSecretSharePerRule =
privatelyShareAttributionResultsConversions<MY_ROLE>(
cvmAttributionResultsPerRule, numIds);
PrivateAggregation privateAggregation;
privateAggregation.privateTpm = privateTpmArrays;
privateAggregation.privateCvm = privateCvmArrays;
privateAggregation.tpAttributionResults = privateTpmSecretSharePerRule;
privateAggregation.convAttributionResults = privateCvmSecretSharePerRule;
aggregationMetrics.computeAggregationsPerFormat(privateAggregation);
out.ruleToMetrics[attributionRules.at(i)] = aggregationMetrics.reveal();
}
return out;
}