Skip to content

Commit e5a8815

Browse files
author
Jason Marechal
committed
Fix: crash
1 parent a30cae8 commit e5a8815

8 files changed

Lines changed: 58 additions & 52 deletions

File tree

CODE_REVIEW_SUMMARY.md

Whitespace-only changes.

src/cpp/benders/benders_mpi/BendersMPI.cpp

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
BendersMpi::BendersMpi(const BendersBaseOptions& options,
1313
std::shared_ptr<ILogger> logger,
1414
std::shared_ptr<Output::OutputWriter> writer,
15-
mpi::communicator& world,
15+
std::shared_ptr<mpi::communicator> world,
1616
std::shared_ptr<MathLoggerDriver> mathLoggerDriver):
1717
BendersBase(options, std::move(logger), std::move(writer), std::move(mathLoggerDriver)),
18-
_world(world)
18+
_world(std::move(world))
1919
{
2020
}
2121

@@ -35,8 +35,8 @@ void BendersMpi::InitializeProblems()
3535
int current_problem_id = 0;
3636
for (auto it = coupling_map_.begin(); it != coupling_map_.end();)
3737
{
38-
auto process_to_feed = current_problem_id % _world.size();
39-
if (process_to_feed != _world.rank())
38+
auto process_to_feed = current_problem_id % _world->size();
39+
if (process_to_feed != _world->rank())
4040
{
4141
it = coupling_map_.erase(it);
4242
}
@@ -54,8 +54,8 @@ void BendersMpi::InitializeProblems()
5454
for (const auto& problem: coupling_map_)
5555
{
5656
// In case there are more subproblems than process
57-
if (auto process_to_feed = current_problem_id % _world.size();
58-
process_to_feed == _world.rank())
57+
if (auto process_to_feed = current_problem_id % _world->size();
58+
process_to_feed == _world->rank())
5959
{ // Assign [problemNumber % processCount] to processID
6060

6161
const auto subProblemFilePath = GetSubproblemPath(problem.first);
@@ -71,7 +71,7 @@ void BendersMpi::InitializeProblems()
7171

7272
void BendersMpi::BroadCastVariablesIndices()
7373
{
74-
if (_world.rank() == rank_0)
74+
if (_world->rank() == rank_0)
7575
{
7676
SetSubproblemsVariablesIndices();
7777
}
@@ -80,7 +80,7 @@ void BendersMpi::BroadCastVariablesIndices()
8080

8181
void BendersMpi::BuildMasterProblem()
8282
{
83-
if (_world.rank() == rank_0)
83+
if (_world->rank() == rank_0)
8484
{
8585
std::shared_ptr<IBendersProblemProvider>
8686
benders_problem_provider = std::make_shared<BendersProblemFromFile>(get_master_path());
@@ -127,7 +127,7 @@ void BendersMpi::step_1_solve_master()
127127

128128
void BendersMpi::check_convergence()
129129
{
130-
step_4_update_best_solution(_world.rank());
130+
step_4_update_best_solution(_world->rank());
131131
}
132132

133133
Point BendersMpi::get_master_x() const
@@ -147,7 +147,7 @@ void BendersMpi::BuildCut()
147147

148148
void BendersMpi::do_solve_master_create_trace_and_update_cuts()
149149
{
150-
if (_world.rank() == rank_0)
150+
if (_world->rank() == rank_0)
151151
{
152152
if (SwitchToIntegerMaster(_data.is_in_initial_relaxation))
153153
{
@@ -164,7 +164,7 @@ void BendersMpi::BroadcastXCut()
164164
if (!exception_raised_)
165165
{
166166
Point x_cut = get_x_cut();
167-
mpi::broadcast(_world, x_cut, rank_0);
167+
mpi::broadcast(*_world, x_cut, rank_0);
168168
set_x_cut(x_cut);
169169
}
170170
}
@@ -228,7 +228,7 @@ void BendersMpi::gather_subproblems_cut_package_and_build_cuts(
228228
void BendersMpi::GatherCuts(const SubProblemDataMap& subproblem_data_map, const Timer& walltime)
229229
{
230230
std::vector<SubProblemDataMap> gathered_subproblem_map;
231-
mpi::gather(_world, subproblem_data_map, gathered_subproblem_map, rank_0);
231+
mpi::gather(*_world, subproblem_data_map, gathered_subproblem_map, rank_0);
232232
_data.subproblems_walltime = walltime.elapsed();
233233
double cumulative_subproblems_timer_per_iter(0);
234234
Reduce(_data.subproblems_cputime,
@@ -243,7 +243,7 @@ void BendersMpi::GatherCuts(const SubProblemDataMap& subproblem_data_map, const
243243
{
244244
ComputeSubproblemsContributionToCriteria(subproblem_data_map);
245245

246-
if (_world.rank() == rank_0)
246+
if (_world->rank() == rank_0)
247247
{
248248
criteria_vector_for_each_iteration_.push_back(
249249
_data.criteria_current_iteration_data.criteria);
@@ -323,7 +323,7 @@ void BendersMpi::master_build_cuts(const std::vector<SubProblemDataMap>& gathere
323323

324324
_data.ub = 0;
325325

326-
if (_world.rank() == rank_0)
326+
if (_world->rank() == rank_0)
327327
{
328328
// TODO: In Benders MPI the subproblem split can be done once as it is the same at each
329329
// iteration
@@ -360,7 +360,7 @@ void BendersMpi::SetSubproblemDataCostAndSimplexIter(
360360
void BendersMpi::check_if_some_proc_had_a_failure(int success)
361361
{
362362
int global_success;
363-
mpi::all_reduce(_world, success, global_success, mpi::bitwise_and<int>());
363+
mpi::all_reduce(*_world, success, global_success, mpi::bitwise_and<int>());
364364
if (global_success == 0)
365365
{
366366
exception_raised_ = true;
@@ -394,15 +394,15 @@ void BendersMpi::step_4_update_best_solution(int rank)
394394
*/
395395
void BendersMpi::free()
396396
{
397-
if (_world.rank() == rank_0)
397+
if (_world->rank() == rank_0)
398398
{
399399
free_master();
400400
}
401401
else
402402
{
403403
free_subproblems();
404404
}
405-
_world.barrier();
405+
_world->barrier();
406406
}
407407

408408
/*!
@@ -442,40 +442,40 @@ void BendersMpi::Run()
442442

443443
if (!exception_raised_)
444444
{
445-
step_4_update_best_solution(_world.rank());
445+
step_4_update_best_solution(_world->rank());
446446
}
447447
_data.stop |= exception_raised_;
448448

449-
broadcast(_world, _data.is_in_initial_relaxation, rank_0);
450-
broadcast(_world, _data.stop, rank_0);
449+
broadcast(*_world, _data.is_in_initial_relaxation, rank_0);
450+
broadcast(*_world, _data.stop, rank_0);
451451

452452
if (Rank() == rank_0)
453453
{
454454
mathLoggerDriver_->Print(_data);
455455
SaveCurrentBendersData();
456456
}
457457
}
458-
if (_world.rank() == rank_0)
458+
if (_world->rank() == rank_0)
459459
{
460460
CloseCsvFile();
461461
EndWritingInOutputFile();
462462
write_basis();
463463
}
464-
_world.barrier();
464+
_world->barrier();
465465
}
466466

467467
void BendersMpi::PreRunInitialization()
468468
{
469469
init_data();
470470

471-
if (_world.rank() == rank_0)
471+
if (_world->rank() == rank_0)
472472
{
473473
HandleInitialMasterRelaxation();
474474
}
475475

476-
_world.barrier();
476+
_world->barrier();
477477

478-
if (_world.rank() == rank_0)
478+
if (_world->rank() == rank_0)
479479
{
480480
ChecksResumeMode();
481481
if (is_trace())
@@ -498,7 +498,7 @@ void BendersMpi::launch()
498498
{
499499
InitializeProblems();
500500
}
501-
_world.barrier();
501+
_world->barrier();
502502

503503
try
504504
{
@@ -518,13 +518,13 @@ void BendersMpi::launch()
518518
write_exception_message(ex);
519519
}
520520

521-
_world.barrier();
521+
_world->barrier();
522522

523523
post_run_actions();
524524

525525
if (free_problems_)
526526
{
527527
free();
528528
}
529-
_world.barrier();
529+
_world->barrier();
530530
}

src/cpp/benders/benders_mpi/BendersMpiOuterLoop.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ namespace Outerloop
88
BendersMpiOuterLoop::BendersMpiOuterLoop(const BendersBaseOptions& options,
99
Logger logger,
1010
std::shared_ptr<Output::OutputWriter> writer,
11-
mpi::communicator& world,
11+
std::shared_ptr<mpi::communicator> world,
1212
std::shared_ptr<MathLoggerDriver> mathLoggerDriver):
13-
BendersMpi(options, std::move(logger), std::move(writer), world, std::move(mathLoggerDriver))
13+
BendersMpi(options, std::move(logger), std::move(writer), std::move(world), std::move(mathLoggerDriver))
1414
{
1515
}
1616

@@ -20,3 +20,5 @@ void BendersMpiOuterLoop::launch()
2020
BendersMpi::launch();
2121
}
2222
} // namespace Outerloop
23+
24+

src/cpp/benders/benders_mpi/OuterLoopBenders.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ OuterLoopBenders::OuterLoopBenders(
88
std::shared_ptr<IMasterUpdate> master_updater,
99
std::shared_ptr<ICutsManager> cuts_manager,
1010
pBendersBase benders,
11-
mpi::communicator& world):
11+
std::shared_ptr<mpi::communicator> world):
1212
master_updater_(std::move(master_updater)),
1313
cuts_manager_(std::move(cuts_manager)),
1414
benders_(std::move(benders)),
15-
world_(world),
15+
world_(std::move(world)),
1616
outer_loop_biLevel_(outer_loop_data)
1717
{
1818
loggers_.AddLogger(benders_->_logger);
@@ -74,20 +74,20 @@ double OuterLoopBenders::OuterLoopLambdaMax() const
7474
bool OuterLoopBenders::UpdateMaster()
7575
{
7676
bool stop_update_master = false;
77-
if (world_.rank() == 0)
77+
if (world_->rank() == 0)
7878
{
7979
stop_update_master = master_updater_->Update(outer_loop_biLevel_.LambdaMin(),
8080
outer_loop_biLevel_.LambdaMax());
8181
}
8282

83-
mpi::broadcast(world_, stop_update_master, 0);
83+
mpi::broadcast(*world_, stop_update_master, 0);
8484
return stop_update_master;
8585
}
8686

8787
void OuterLoopBenders::OuterLoopCheckFeasibility()
8888
{
8989
std::vector<double> obj_coeff;
90-
if (world_.rank() == 0)
90+
if (world_->rank() == 0)
9191
{
9292
obj_coeff = benders_->MasterObjectiveFunctionCoeffs();
9393

@@ -96,7 +96,7 @@ void OuterLoopBenders::OuterLoopCheckFeasibility()
9696
}
9797

9898
benders_->launch();
99-
if (world_.rank() == 0)
99+
if (world_->rank() == 0)
100100
{
101101
benders_->SetMasterObjectiveFunction(obj_coeff.data(), 0, obj_coeff.size() - 1);
102102
benders_->UpdateOverallCosts();
@@ -124,7 +124,7 @@ void OuterLoopBenders::InitExternalValues(bool is_bilevel_check_all, double lamb
124124

125125
void OuterLoopBenders::OuterLoopBilevelChecks()
126126
{
127-
if (world_.rank() == 0 && benders_->Options().EXTERNAL_LOOP_OPTIONS.DO_OUTER_LOOP
127+
if (world_->rank() == 0 && benders_->Options().EXTERNAL_LOOP_OPTIONS.DO_OUTER_LOOP
128128
&& !is_bilevel_check_all_)
129129
{
130130
const WorkerMasterData& workerMasterData = benders_->BestIterationWorkerMaster();

src/cpp/benders/benders_mpi/include/antares-xpansion/benders/benders_mpi/BendersMPI.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

3+
#include <memory>
4+
35
#include "antares-xpansion/benders/benders_core/BendersBase.h"
46
#include "antares-xpansion/benders/benders_core/SubproblemCut.h"
57
#include "antares-xpansion/benders/benders_core/SubproblemWorker.h"
@@ -19,7 +21,7 @@ class BendersMpi: public BendersBase
1921
BendersMpi(const BendersBaseOptions& options,
2022
std::shared_ptr<ILogger> logger,
2123
std::shared_ptr<Output::OutputWriter> writer,
22-
mpi::communicator& world,
24+
std::shared_ptr<mpi::communicator> world,
2325
std::shared_ptr<MathLoggerDriver> mathLoggerDriver);
2426

2527
void launch() override;
@@ -46,7 +48,7 @@ class BendersMpi: public BendersBase
4648
void SetSubproblemDataCostAndSimplexIter(
4749
const std::vector<SubProblemDataMap>& gathered_subproblem_map);
4850

49-
mpi::communicator& _world;
51+
std::shared_ptr<mpi::communicator> _world;
5052

5153
private:
5254
void step_1_solve_master();
@@ -77,49 +79,49 @@ class BendersMpi: public BendersBase
7779

7880
int Rank() const
7981
{
80-
return _world.rank();
82+
return _world->rank();
8183
}
8284

8385
template<typename T>
8486
void BroadCast(T& value, int root) const
8587
{
86-
mpi::broadcast(_world, value, root);
88+
mpi::broadcast(*_world, value, root);
8789
}
8890

8991
template<typename T>
9092
void BroadCast(T* values, int n, int root) const
9193
{
92-
mpi::broadcast(_world, values, n, root);
94+
mpi::broadcast(*_world, values, n, root);
9395
}
9496

9597
template<typename T>
9698
void Gather(const T& value, std::vector<T>& vector_of_values, int root) const
9799
{
98-
mpi::gather(_world, value, vector_of_values, root);
100+
mpi::gather(*_world, value, vector_of_values, root);
99101
}
100102

101103
void BuildMasterProblem();
102104

103105
int WorldSize() const
104106
{
105-
return _world.size();
107+
return _world->size();
106108
}
107109

108110
void Barrier() const
109111
{
110-
_world.barrier();
112+
_world->barrier();
111113
}
112114

113115
template<typename T, typename Op>
114116
void Reduce(const T& in_value, T& out_value, Op op, int root) const
115117
{
116-
mpi::reduce(_world, in_value, out_value, op, root);
118+
mpi::reduce(*_world, in_value, out_value, op, root);
117119
}
118120

119121
template<typename T, typename Op>
120122
void AllReduce(const T& in_value, T& out_value, Op op) const
121123
{
122-
mpi::all_reduce(_world, in_value, out_value, op);
124+
mpi::all_reduce(*_world, in_value, out_value, op);
123125
}
124126

125127
virtual void GatherCuts(const SubProblemDataMap& subproblem_data_map, const Timer& walltime);

src/cpp/benders/benders_mpi/include/antares-xpansion/benders/benders_mpi/BendersMpiOuterLoop.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class BendersMpiOuterLoop: public BendersMpi
1212
BendersMpiOuterLoop(const BendersBaseOptions& options,
1313
Logger logger,
1414
std::shared_ptr<Output::OutputWriter> writer,
15-
mpi::communicator& world,
15+
std::shared_ptr<mpi::communicator> world,
1616
std::shared_ptr<MathLoggerDriver> mathLoggerDriver);
1717

1818
void launch() override;

src/cpp/benders/benders_mpi/include/antares-xpansion/benders/benders_mpi/OuterLoopBenders.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#pragma once
2+
#include <memory>
3+
24
#include "antares-xpansion/benders/benders_core/BendersAlgorithm.h"
35
#include "antares-xpansion/benders/benders_core/BendersBase.h"
46
#include "antares-xpansion/benders/benders_core/CriterionComputation.h"
@@ -24,7 +26,7 @@ class OuterLoopBenders: public OuterLoop
2426
std::shared_ptr<IMasterUpdate> master_updater,
2527
std::shared_ptr<ICutsManager> cuts_manager,
2628
pBendersBase benders,
27-
mpi::communicator& world);
29+
std::shared_ptr<mpi::communicator> world);
2830

2931
void Run() override;
3032

@@ -54,7 +56,7 @@ class OuterLoopBenders: public OuterLoop
5456
std::shared_ptr<ICutsManager> cuts_manager_;
5557
pBendersBase benders_;
5658
BendersLoggerBase loggers_;
57-
mpi::communicator& world_;
59+
std::shared_ptr<mpi::communicator> world_;
5860
bool is_bilevel_check_all_ = false;
5961
void InitExternalValues(bool is_bilevel_check_all, double lambda);
6062
OuterLoopBiLevel outer_loop_biLevel_;

0 commit comments

Comments
 (0)