/**
 *   Copyright 2016, Quickstep Research Group, Computer Sciences Department,
 *     University of Wisconsin—Madison.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 **/

#ifndef QUICKSTEP_TRANSACTION_STRONGLY_CONNECTED_COMPONENTS_HPP_
#define QUICKSTEP_TRANSACTION_STRONGLY_CONNECTED_COMPONENTS_HPP_

#include <cstddef>
#include <cstdint>
#include <stack>
#include <unordered_map>
#include <vector>

#include "transaction/DirectedGraph.hpp"
#include "utility/Macros.hpp"

namespace quickstep {

namespace transaction {

/** \addtogroup Transaction
 *  @{
 */

/**
 * @brief Class for applying Tarjan's strongly connected components algorithm
 *        to a directed graph. The class finds and stores information to
 *        identify components and nodes-to-component mapping. For all nodes
 *        v, w in a strongly connected component, there is a path from v to w,
 *        and a path from w to v.
 **/
class StronglyConnectedComponents {
 public:
  /**
   * @brief Constructor.
   *
   * @param directed_graph The directed graph which the algorithm runs.
   **/
  explicit StronglyConnectedComponents(const DirectedGraph &directed_graph);

  /**
   * @brief Getter for the component id of the node.
   *
   * @param node_id Id of the node in the graph.
   * @return Id of the component to which the given node belongs.
   **/
  inline std::uint64_t getComponentId(DirectedGraph::node_id node_id) const {
    return component_ids_[node_id];
  }

  /**
   * @brief Getter for total number of strongly connected components.
   * @warning This method should be called after findStronglyConnectedComponents().
   *
   * @return Total number of strongly connected components.
   **/
  inline std::size_t getTotalComponents() const {
    return no_of_components_;
  }

  /**
   * @brief Gets a component id to list of node ids mapping.
   *
   * @return Mapping of component ids to list of nodes.
   **/
  std::unordered_map<std::uint64_t, std::vector<DirectedGraph::node_id>> getComponentMapping() const;

 private:
  // Enumarates all strongly connected components, and stores node-to-component
  // mapping in the graph.
  void findStronglyConnectedComponents();

  // Applies DFS to the node whic has id v.
  void depthFirstSearch(DirectedGraph::node_id v);

  // Const reference to the graph.
  const DirectedGraph &directed_graph_;

  // is_marked[v] == true if depth first search traversed the node with id v.
  std::vector<bool> is_marked_;

  // component_ids_[v] == i if strongly connected component
  // which the node with id v belongs to, has id i.
  std::vector<std::uint64_t> component_ids_;

  // low_ids_[v] == i if lowest traversal id seen by the node
  // with id v equals i.
  std::vector<std::uint64_t> low_ids_;

  // Keeps track of the nodes in the current traversal of the graph.
  std::stack<DirectedGraph::node_id> traversal_stack_;

  // Keeps track of the current index number of depth first search traversal.
  std::uint64_t preorder_counter_;

  // Keeps track of the current number of the strongly connected component.
  std::uint64_t no_of_components_;

  DISALLOW_COPY_AND_ASSIGN(StronglyConnectedComponents);
};

/** @} */

}  // namespace transaction

}  // namespace quickstep

#endif  // QUICKSTEP_TRANSACTION_STRONGLY_CONNECTED_COMPONENTS_HPP_
