Antares Xpansion
Investment simulations for Antares studies
Loading...
Searching...
No Matches
BendersMPI.h
1#pragma once
2
3#include "antares-xpansion/benders/benders_core/BendersBase.h"
4#include "antares-xpansion/benders/benders_core/BendersStructsDatas.h"
5#include "antares-xpansion/benders/benders_core/SubproblemCut.h"
6#include "antares-xpansion/benders/benders_core/SubproblemWorker.h"
7#include "antares-xpansion/benders/benders_core/Worker.h"
8#include "antares-xpansion/benders/benders_core/WorkerMaster.h"
9#include "antares-xpansion/helpers/ArchiveReader.h"
10#include "antares-xpansion/helpers/Timer.h"
11#include "antares-xpansion/xpansion_interfaces/ILogger.h"
12#include "antares-xpansion/xpansion_interfaces/LoggerUtils.h"
13#include "common_mpi.h"
14
20{
21public:
22 ~BendersMpi() override = default;
23 BendersMpi(const BendersBaseOptions& options,
24 Logger logger,
25 std::shared_ptr<Output::OutputWriter> writer,
26 mpi::environment& env,
27 mpi::communicator& world,
28 std::shared_ptr<MathLoggerDriver> mathLoggerDriver);
29
30 void launch() override;
31
32 std::string BendersName() const override
33 {
34 return "Benders mpi";
35 }
36
37 const int rank_0 = 0;
38
39protected:
40 void free() override;
41 void Run() override;
42 void InitializeProblems() override;
43 void BroadcastXCut();
44
45 mpi::communicator& _world;
46
47private:
48 void step_1_solve_master();
49 void step_2_solve_subproblems_and_build_cuts();
50 void step_4_update_best_solution(int rank);
51
52 void master_build_cuts(std::vector<SubProblemDataMap> gathered_subproblem_map);
53 SubProblemDataMap get_subproblem_cut_package();
54
55 void solve_master_and_create_trace();
56
57 void do_solve_master_create_trace_and_update_cuts();
58
59 virtual void gather_subproblems_cut_package_and_build_cuts(
60 const SubProblemDataMap& subproblem_data_map,
61 const Timer& process_timer);
62
63 void write_exception_message(const std::exception& ex) const;
64
65 void check_if_some_proc_had_a_failure(int success);
66
67 mpi::environment& _env;
68
69protected:
70 [[nodiscard]] bool shouldParallelize() const final
71 {
72 return false;
73 }
74
75 void PreRunInitialization();
76
77 int Rank() const
78 {
79 return _world.rank();
80 }
81
82 template<typename T>
83 void BroadCast(T& value, int root) const
84 {
85 mpi::broadcast(_world, value, root);
86 }
87
88 template<typename T>
89 void BroadCast(T* values, int n, int root) const
90 {
91 mpi::broadcast(_world, values, n, root);
92 }
93
94 template<typename T>
95 void Gather(const T& value, std::vector<T>& vector_of_values, int root) const
96 {
97 mpi::gather(_world, value, vector_of_values, root);
98 }
99
100 void BuildMasterProblem();
101
102 int WorldSize() const
103 {
104 return _world.size();
105 }
106
107 void Barrier() const
108 {
109 _world.barrier();
110 }
111
112 template<typename T, typename Op>
113 void Reduce(const T& in_value, T& out_value, Op op, int root) const
114 {
115 mpi::reduce(_world, in_value, out_value, op, root);
116 }
117
118 template<typename T, typename Op>
119 void AllReduce(const T& in_value, T& out_value, Op op) const
120 {
121 mpi::all_reduce(_world, in_value, out_value, op);
122 }
123
124 virtual void GatherCuts(const SubProblemDataMap& subproblem_data_map, const Timer& walltime);
125 void BroadCastVariablesIndices();
126 virtual void ComputeSubproblemsContributionToCriteria(
127 const SubProblemDataMap& subproblem_data_map);
128 void SolveSubproblem(PlainData::SubProblemData& subproblem_data,
129 const std::string& name,
130 const std::shared_ptr<SubproblemWorker>& worker) override;
131 void UpdateMaxCriterionArea();
132};
Definition BendersBase.h:40
Class use run the benders algorithm in parallel.
Definition BendersMPI.h:20
void InitializeProblems() override
Method to load each problem in a thread.
Definition BendersMPI.cpp:30
void Run() override
Run Benders algorithm in parallel.
Definition BendersMPI.cpp:360
void free() override
Method to free the memory used by each problem.
Definition BendersMPI.cpp:341
Definition Timer.h:10
Definition launch.py:1
Definition common.h:208
Definition SubproblemCut.h:12