int main()

in fbpcs/emp_games/lift/calculator/main.cpp [83:169]


int main(int argc, char** argv) {
  folly::init(&argc, &argv);
  fbpcf::AwsSdk::aquire();
  gflags::ParseCommandLineFlags(&argc, &argv, true);

  std::vector<std::string> inputFilepaths;
  std::vector<std::string> outputFilepaths;

  if (!FLAGS_input_base_path.empty()) {
    std::string input_base_path = FLAGS_input_base_path + "_";
    std::string output_base_path = FLAGS_output_base_path + "_";
    for (auto i = FLAGS_file_start_index;
         i < FLAGS_file_start_index + FLAGS_num_files;
         ++i) {
      inputFilepaths.push_back(input_base_path + std::to_string(i));
      outputFilepaths.push_back(output_base_path + std::to_string(i));
    }
  } else {
    std::filesystem::path inputDirectory{FLAGS_input_directory};
    std::filesystem::path outputDirectory{FLAGS_output_directory};

    std::vector<std::string> inputFilenames;
    folly::split(',', FLAGS_input_filenames, inputFilenames);

    std::vector<std::string> outputFilenames;
    folly::split(",", FLAGS_output_filenames, outputFilenames);

    // Make sure the number of input files equals output files
    if (inputFilenames.size() != outputFilenames.size()) {
      XLOGF(
          ERR,
          "Error: input_filenames items ({}) does not equal output_filenames items ({})",
          inputFilenames.size(),
          outputFilenames.size());
      return 1;
    }

    for (std::size_t i = 0; i < inputFilenames.size(); ++i) {
      inputFilepaths.push_back(inputDirectory / inputFilenames[i]);
      outputFilepaths.push_back(outputDirectory / outputFilenames[i]);
    }
  }

  {
    // Build a quick list of input/output files to log
    std::ostringstream inputFileLogList;
    for (auto inputFilepath : inputFilepaths) {
      inputFileLogList << "\t\t" << inputFilepath << "\n";
    }
    std::ostringstream outputFileLogList;
    for (auto outputFilepath : outputFilepaths) {
      outputFileLogList << "\t\t" << outputFilepath << "\n";
    }
    XLOG(INFO) << "Running conversion lift with settings:\n"
               << "\tparty: " << FLAGS_party << "\n"
               << "\tserver_ip_address: " << FLAGS_server_ip << "\n"
               << "\tport: " << FLAGS_port << "\n"
               << "\tconcurrency: " << FLAGS_concurrency << "\n"
               << "\tinput: " << inputFileLogList.str() << "\n"
               << "\toutput: " << outputFileLogList.str();
  }

  auto party = static_cast<fbpcf::Party>(FLAGS_party);

  // since DEFINE_INT16 is not supported, cast int32_t FLAGS_concurrency to
  // int16_t is necessarys here
  int16_t concurrency = static_cast<int16_t>(FLAGS_concurrency);

  // construct calculatorApps according to  FLAGS_num_shards and
  // FLAGS_concurrency
  std::vector<std::unique_ptr<CalculatorApp>> calculatorApps;
  for (std::size_t i = 0; i < inputFilepaths.size(); i++) {
    calculatorApps.push_back(std::make_unique<CalculatorApp>(
        party,
        FLAGS_server_ip,
        FLAGS_port + i,
        inputFilepaths[i],
        outputFilepaths[i],
        FLAGS_use_xor_encryption));
  }

  // executor calculatorApps using fbpcf::MpcAppExecutor
  fbpcf::MpcAppExecutor<CalculatorApp> executor{concurrency};
  executor.execute(calculatorApps);

  return 0;
}