12 enum NumericalPolicy { Default, ColumnPoolCleanUp, NoDualSmoothing, Failure };
14 DantzigWolfeDecomposition& m_parent;
15 double m_best_bound_stop;
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;
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;
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;
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();
44 bool check_numerical_stability();
47 void next_numerical_policy();
51 void log_sub_problems();
54 friend std::ostream& operator<<(std::ostream& t_os, idol::Optimizers::DantzigWolfeDecomposition::ColumnGeneration::NumericalPolicy t_numerical_policy);
56 ColumnGeneration(DantzigWolfeDecomposition& t_parent,
bool t_use_farkas_for_infeasibility,
double t_best_bound_stop);
58 [[nodiscard]]
const DantzigWolfeDecomposition& parent()
const {
return m_parent; }
60 DantzigWolfeDecomposition& parent() {
return m_parent; }
62 [[nodiscard]] SolutionStatus status()
const {
return m_status; }
64 [[nodiscard]] SolutionReason reason()
const {
return m_reason; }
66 [[nodiscard]]
double best_obj()
const {
return m_best_obj; }
68 [[nodiscard]]
double best_bound()
const {
return m_best_bound; }
70 [[nodiscard]]
const PrimalPoint& primal_solution()
const {
return m_master_primal_solution.value(); }
72 void set_best_bound_stop(
double t_best_bound_stop) { m_best_bound_stop = t_best_bound_stop; }