Loading...
Searching...
No Matches
ColumnGeneration.h
1//
2// Created by henri on 31.10.23.
3//
4
5#ifndef IDOL_COLUMNGENERATION_H
6#define IDOL_COLUMNGENERATION_H
7
8#include "Optimizers_DantzigWolfeDecomposition.h"
9
11
12 enum NumericalPolicy { Default, ColumnPoolCleanUp, NoDualSmoothing, Failure };
13
14 DantzigWolfeDecomposition& m_parent;
15 double m_best_bound_stop;
16
17 const unsigned int m_max_n_iterations_without_generating_column = 200;
18 unsigned int m_n_iterations_without_generating_column = 0;
19 NumericalPolicy m_numerical_policy = Default;
20
21 SolutionStatus m_status = Loaded;
22 SolutionReason m_reason = NotSpecified;
23 std::optional<PrimalPoint> m_master_primal_solution;
24 std::optional<DualPoint> m_master_dual_solution;
25 std::vector<DantzigWolfe::SubProblem::PhaseId> m_sub_problems_phases;
26 double m_best_obj = -Inf;
27 double m_best_bound = +Inf;
28
29 const bool m_use_farkas_for_infeasibility;
30 unsigned int m_iteration_count = 0;
31 unsigned int m_n_generated_columns = 0;
32 bool m_solve_dual_master = false;
33 bool m_is_terminated = false;
34 bool m_current_iteration_is_using_farkas = false;
35
36 void initialize_sub_problem_phases();
37 void solve_dual_master();
38 [[nodiscard]] bool gap_is_closed() const;
39 bool check_stopping_criterion();
40 void update_sub_problems();
41 void solve_sub_problems_in_parallel();
42 void analyze_sub_problems();
43 void enrich_master();
44 bool check_numerical_stability();
45 void pool_clean_up();
46
47 void next_numerical_policy();
48
49 void log_init();
50 void log_master();
51 void log_sub_problems();
52 void log_end();
53
54 friend std::ostream& operator<<(std::ostream& t_os, idol::Optimizers::DantzigWolfeDecomposition::ColumnGeneration::NumericalPolicy t_numerical_policy);
55public:
56 ColumnGeneration(DantzigWolfeDecomposition& t_parent, bool t_use_farkas_for_infeasibility, double t_best_bound_stop);
57
58 [[nodiscard]] const DantzigWolfeDecomposition& parent() const { return m_parent; }
59
60 DantzigWolfeDecomposition& parent() { return m_parent; }
61
62 [[nodiscard]] SolutionStatus status() const { return m_status; }
63
64 [[nodiscard]] SolutionReason reason() const { return m_reason; }
65
66 [[nodiscard]] double best_obj() const { return m_best_obj; }
67
68 [[nodiscard]] double best_bound() const { return m_best_bound; }
69
70 [[nodiscard]] const PrimalPoint& primal_solution() const { return m_master_primal_solution.value(); }
71
72 void set_best_bound_stop(double t_best_bound_stop) { m_best_bound_stop = t_best_bound_stop; }
73
74 void execute();
75};
76
77
78#endif //IDOL_COLUMNGENERATION_H