12    double m_best_bound_stop;
 
   14    SolutionStatus m_status = Loaded;
 
   15    SolutionReason m_reason = NotSpecified;
 
   16    std::optional<PrimalPoint> m_master_primal_solution;
 
   17    std::optional<DualPoint> m_last_master_solution;
 
   18    std::vector<DantzigWolfe::SubProblem::PhaseId> m_sub_problems_phases;
 
   19    double m_best_obj = -Inf;
 
   20    double m_best_bound = +Inf;
 
   22    const bool m_use_farkas_for_infeasibility;
 
   23    unsigned int m_iteration_count = 0;
 
   24    unsigned int m_n_generated_columns = 0;
 
   25    bool m_solve_dual_master = 
false;
 
   26    bool m_is_terminated = 
false;
 
   27    bool m_current_iteration_is_using_farkas = 
false;
 
   29    void initialize_sub_problem_phases();
 
   30    void solve_dual_master();
 
   31    bool gap_is_closed() 
const;
 
   32    bool check_stopping_criterion();
 
   33    void update_sub_problems();
 
   34    void solve_sub_problems_in_parallel();
 
   35    void analyze_sub_problems();
 
   41    void log_sub_problems();
 
   50    SolutionStatus status()
 const { 
return m_status; }
 
   52    SolutionReason reason()
 const { 
return m_reason; }
 
   54    double best_obj()
 const { 
return m_best_obj; }
 
   56    double best_bound()
 const { 
return m_best_bound; }
 
   58    const PrimalPoint& primal_solution()
 const { 
return m_master_primal_solution.value(); }
 
   60    void set_best_bound_stop(
double t_best_bound_stop) { m_best_bound_stop = t_best_bound_stop; }