// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "algorithms/rappor/rappor_analyzer_utils.h"

#include <vector>

using cobalt_lossmin::InstanceSet;

namespace cobalt {
namespace rappor {

void PrepareSecondRapporStepMatrix(InstanceSet* second_step_matrix,
                                   const std::vector<int>& second_step_cols,
                                   const InstanceSet& full_matrix,
                                   int num_cohorts, int num_hashes) {
  // We will construct the matrix from triplets which is simple and efficient.
  const uint32_t second_step_num_candidates = second_step_cols.size();
  const int nonzero_matrix_entries =
      num_cohorts * num_hashes * second_step_num_candidates;
  std::vector<Eigen::Triplet<double>> second_step_matrix_triplets;
  second_step_matrix_triplets.reserve(nonzero_matrix_entries);

  // Construct a ColMajor copy of candidate_matrix_ format to iterate over
  // columns efficiently, and form the triplets.
  Eigen::SparseMatrix<double, Eigen::ColMajor> candidate_matrix_col_major =
      full_matrix;
  for (uint32_t col_i = 0; col_i < second_step_num_candidates; col_i++) {
    // Iterate over column corresponding to this candidate and update
    // triplets.
    for (Eigen::SparseMatrix<double, Eigen::ColMajor>::InnerIterator it(
             candidate_matrix_col_major, second_step_cols[col_i]);
         it; ++it) {
      second_step_matrix_triplets.push_back(
          Eigen::Triplet<double>(it.row(), col_i, it.value()));
    }
  }

  // Build the second step matrix.
  second_step_matrix->setFromTriplets(second_step_matrix_triplets.begin(),
                                      second_step_matrix_triplets.end());
}

}  // namespace rappor
}  // namespace cobalt
