idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
BranchingRule.h
1//
2// Created by henri on 21/03/23.
3//
4
5#ifndef IDOL_BRANCHINGRULE_H
6#define IDOL_BRANCHINGRULE_H
7
8#include "idol/mixed-integer/optimizers/branch-and-bound/nodes/Node.h"
9#include "idol/general/utils/exceptions/Exception.h"
10#include <list>
11#include <string>
12
13namespace idol {
14 namespace Optimizers {
15 template<class NodeInfoT>
16 class BranchAndBound;
17 }
18
19 template<class NodeInfoT>
20 class BranchingRule;
21}
22
23template<class NodeInfoT>
25 friend class Optimizers::BranchAndBound<NodeInfoT>;
27protected:
28 [[nodiscard]] std::string name() const { return "branching-rule"; }
29public:
30 explicit BranchingRule(const Optimizers::BranchAndBound<NodeInfoT>& t_parent) : m_parent(t_parent) {}
31 virtual ~BranchingRule() = default;
32
33 [[nodiscard]] const Optimizers::BranchAndBound<NodeInfoT>& parent() const { return m_parent; }
34
35 [[nodiscard]] const Model& model() const { return m_parent.parent(); }
36
37 virtual void initialize() {}
38
39 [[nodiscard]] virtual bool is_valid(const Node<NodeInfoT>& t_node) = 0;
40
41 [[nodiscard]] virtual std::list<NodeInfoT*> create_child_nodes(const Node<NodeInfoT>& t_node) = 0;
42
43 virtual void on_node_solved(const Node<NodeInfoT>& t_node) {}
44
45 virtual void on_nodes_have_been_created() {}
46
47 template<class T> T& as() {
48 auto* result = dynamic_cast<T*>(this);
49 if (!result) {
50 throw Exception("Bad cast.");
51 }
52 return *result;
53 }
54
55 template<class T> const T& as() const {
56 auto* result = dynamic_cast<const T*>(this);
57 if (!result) {
58 throw Exception("Bad cast.");
59 }
60 return *result;
61 }
62
63 template<class T> [[nodiscard]] bool is() const {
64 return dynamic_cast<const T*>(this);
65 }
66};
67
68#endif //IDOL_BRANCHINGRULE_H