idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
BranchingWithPriority.h
1//
2// Created by henri on 09.11.23.
3//
4
5#ifndef IDOL_BRANCHINGWITHPRIORITY_H
6#define IDOL_BRANCHINGWITHPRIORITY_H
7
8#include "VariableBranching.h"
9#include "idol/mixed-integer/optimizers/branch-and-bound/branching-rules/impls/LeastInfeasible.h"
10#include "idol/mixed-integer/optimizers/branch-and-bound/branching-rules/impls/BranchingWithPriority.h"
11
12namespace idol {
13 class DefaultNodeInfo;
14
15 template<class NodeT>
16 class BranchingWithPriority;
17}
18
19template<class NodeT = idol::DefaultNodeInfo>
21 std::list<std::unique_ptr<BranchingRuleFactory<NodeT>>> m_branching_rules;
22public:
23 BranchingWithPriority() = default;
24
26
27 for (auto& branching_rule : t_src.m_branching_rules) {
28 m_branching_rules.emplace_back(branching_rule->clone());
29 }
30
31 }
32
39 template<class ReturnT, class T> using only_if_has_Strategy = typename std::pair<typename T::template Strategy<NodeT>, ReturnT>::second_type;
40
41 BranchingWithPriority<NodeT>& add_branching_rule(const BranchingRuleFactory<NodeT>& t_branching_rule) {
42 m_branching_rules.emplace_back(t_branching_rule.clone());
43 return *this;
44 }
45
46 template<class BranchingRuleFactoryT>
47 only_if_has_Strategy<BranchingWithPriority<NodeT>&, BranchingRuleFactoryT> add_branching_rule(const BranchingRuleFactoryT& t_branching_rule) {
48 return add_branching_rule(typename BranchingRuleFactoryT::template Strategy<NodeT>(t_branching_rule));
49 }
50
51 BranchingRule<NodeT> *operator()(const Optimizers::BranchAndBound<NodeT> &t_parent) const override {
52 return new BranchingRules::BranchingWithPriority<NodeT>(t_parent, m_branching_rules);
53 }
54
55 BranchingRuleFactory<NodeT> *clone() const override {
56 return new BranchingWithPriority<NodeT>(*this);
57 }
58};
59
60#endif //IDOL_BRANCHINGWITHPRIORITY_H
typename std::pair< typename T::template Strategy< NodeT >, ReturnT >::second_type only_if_has_Strategy