/*****************************************************************//**
 * \file   SearchStrategy.h
 * \brief  Reperesents the interface of branching strategy with a virtual pure algorithm to override by inherent classes depending on the choosed branching strategy.
 *
 * \author talmefta
 * \date   May 2022
 *********************************************************************/
#ifndef SEARCHSTRATEGY_H
#define SEARCHSTRATEGY_H

#include "Header.h"
#include "Node.h"

 /**
  * \class SearchStrategy
  * \brief Interface of Strategy design pattern dealing with the search strategy of the branch and price tree.
  */

template<class RestrictedMasterProblem, class PricingSubProblem, class ColumnGeneration, class ConstraintType>
class SearchStrategy {

public:
    /**
     * Virtual destructor.
     *
     */
    virtual ~SearchStrategy() {}

    /**
     * Adds the new node to the list of nodes in the branch and price tree. Returns the next node to be explored depending on the search strategy.
     * \details This method has to be implemented in the inherent classes.
     * \param node_list:  list<Node<class RestrictedMasterProblem, class PricingSubProblem, class ColumnGeneration><&
     * \param node: const Node<class RestrictedMasterProblem, class PricingSubProblem, class ColumnGeneration>&
     */
    virtual void add_node(list<Node< RestrictedMasterProblem, PricingSubProblem, ColumnGeneration, ConstraintType>>& node_list,
        Node<RestrictedMasterProblem, PricingSubProblem, ColumnGeneration, ConstraintType>& new_node) const = 0;
};

#endif //SEARCHSTRATEGY_H
