idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
VariableBranching.h
1//
2// Created by henri on 16.10.23.
3//
4
5#ifndef IDOL_VARIABLEBRANCHING_H
6#define IDOL_VARIABLEBRANCHING_H
7
8#include <optional>
9#include <list>
10#include "BranchingRuleFactory.h"
11#include "idol/mixed-integer/optimizers/branch-and-bound/branching-rules/impls/VariableBranching.h"
12#include "idol/mixed-integer/modeling/models/Model.h"
13
14namespace idol {
15 class VariableBranching;
16}
17
19 std::optional<std::list<Var>> m_explicit_branching_candidates;
20public:
21 VariableBranching() = default;
22
23 template<class IteratorT>
24 VariableBranching(IteratorT t_begin, IteratorT t_end) : m_explicit_branching_candidates(std::list<Var>()) {
25
26 for ( ; t_begin != t_end ; ++t_begin) {
27 m_explicit_branching_candidates.value().emplace_back(*t_begin);
28 }
29
30 }
31
32 template<class NodeT>
33 class Strategy : public BranchingRuleFactory<NodeT> {
34 std::optional<std::list<Var>> m_explicit_branching_candidates;
35 protected:
36 [[nodiscard]] std::list<Var> create_branching_candidates(const idol::Model &t_model) const;
37 public:
38 Strategy() = default;
39
40 Strategy(const Strategy& t_src)
42 m_explicit_branching_candidates(t_src.m_explicit_branching_candidates) {}
43
44 template<class IteratorT>
45 Strategy(IteratorT t_begin, IteratorT t_end) : m_explicit_branching_candidates(std::list<Var>()) {
46
47 for ( ; t_begin != t_end ; ++t_begin) {
48 m_explicit_branching_candidates.value().emplace_back(*t_begin);
49 }
50
51 }
52
53 explicit Strategy(const VariableBranching& t_parent) : m_explicit_branching_candidates(t_parent.m_explicit_branching_candidates) {}
54 };
55
56};
57
58template<class NodeT>
59std::list<idol::Var>
61
62 if (m_explicit_branching_candidates.has_value()) {
63 return m_explicit_branching_candidates.value();
64 }
65
66 std::list<Var> result;
67
68 for (const auto& var : t_model.vars()) {
69 if (t_model.get_var_type(var) != Continuous) {
70 result.emplace_back(var);
71 }
72 }
73
74 return result;
75}
76
77#endif //IDOL_VARIABLEBRANCHING_H