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