1#ifndef ZONOOPT_GENUTILITIES_HPP_ 
    2#define ZONOOPT_GENUTILITIES_HPP_ 
   19namespace ZonoOpt::detail
 
   23    void combinations_util(
const std::vector<T>& elements, 
const size_t k, 
const size_t start_index,
 
   24                           std::vector<T>& current_combination,
 
   25                           std::vector<std::vector<T>>& result)
 
   28        if (current_combination.size() == k)
 
   30            result.push_back(current_combination);
 
   35        for (
size_t i = start_index; i < elements.size(); ++i)
 
   38            if (elements.size() - i < k - current_combination.size())
 
   44            current_combination.push_back(elements[i]);
 
   47            combinations_util(elements, k, i + 1, current_combination, result);
 
   50            current_combination.pop_back();
 
   56    std::vector<std::vector<T>> get_combinations(
const std::vector<T>& input_set, 
const size_t k)
 
   58        if (k > input_set.size())
 
   64        std::vector<T> elements(input_set.begin(), input_set.end());
 
   66        std::vector<std::vector<T>> result;
 
   67        std::vector<T> current_combination;
 
   70        combinations_util(elements, k, 0, current_combination, result);
 
   74    inline void print_str(std::stringstream& ss)
 
   79        std::cout << ss.str() << std::endl;