Skip to content

Commit

Permalink
retrieve all vars
Browse files Browse the repository at this point in the history
  • Loading branch information
a-zakir committed Feb 2, 2024
1 parent 35730bc commit 98f3d20
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 21 deletions.
2 changes: 1 addition & 1 deletion src/cpp/benders/benders_by_batch/BendersByBatch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ void BendersByBatch::GetSubproblemCut(
if (std::find(batch_sub_problems.cbegin(), batch_sub_problems.cend(),
name) != batch_sub_problems.cend()) {
Timer subproblem_timer;
SubProblemData subproblem_data;
PlainData::SubProblemData subproblem_data;
worker->fix_to(_data.x_cut);
worker->solve(subproblem_data.lpstatus, Options().OUTPUTROOT,
Options().LAST_MASTER_MPS + MPS_SUFFIX, _writer);
Expand Down
7 changes: 4 additions & 3 deletions src/cpp/benders/benders_core/BendersBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ void BendersBase::PrintCurrentIterationCsv() {
*
* \param subproblem_index : problem id
*/
void print_cut_csv(std::ostream &stream, const SubProblemData &subproblem_data,
void print_cut_csv(std::ostream &stream,
const PlainData::SubProblemData &subproblem_data,
std::string const &subproblem_name, int subproblem_index,
double alpha_i) {
stream << "Subproblem"
Expand Down Expand Up @@ -366,12 +367,12 @@ void BendersBase::GetSubproblemCut(SubProblemDataMap &subproblem_data_map) {
const std::pair<std::string, SubproblemWorkerPtr> &kvp) {
const auto &[name, worker] = kvp;
Timer subproblem_timer;
SubProblemData subproblem_data;
PlainData::SubProblemData subproblem_data;
worker->fix_to(_data.x_cut);
worker->solve(subproblem_data.lpstatus, _options.OUTPUTROOT,
_options.LAST_MASTER_MPS + MPS_SUFFIX, _writer);
worker->get_value(subproblem_data.subproblem_cost);
worker->get_sol(subproblem_data.var_name_and_solution);
worker->get_sol(subproblem_data.variables);
worker->get_subgradient(subproblem_data.var_name_and_subgradient);
worker->get_splex_num_of_ite_last(subproblem_data.simplex_iter);
subproblem_data.subproblem_timer = subproblem_timer.elapsed();
Expand Down
5 changes: 3 additions & 2 deletions src/cpp/benders/benders_core/OuterloopCriterion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ bool OuterloopCriterionLOL::ProcessSum(const BendersCuts& benders_cuts) {
double sum_loss = 0;
for (const auto& [sub_problem_name, sub_problem_data] :
benders_cuts.subsProblemDataMap) {
for (const auto& [var_name, solution] :
sub_problem_data.var_name_and_solution) {
for (auto i(0); i < sub_problem_data.variables.names.size(); ++i) {
auto var_name = sub_problem_data.variables.names[i];
auto solution = sub_problem_data.variables.values[i];
if (std::regex_search(var_name, rgx_) &&
solution > UNSUPPLIED_ENERGY_MAX) {
sum_loss += solution;
Expand Down
14 changes: 6 additions & 8 deletions src/cpp/benders/benders_core/SubproblemWorker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,16 +73,14 @@ void SubproblemWorker::get_subgradient(Point &s) const {
*
* \param lb : reference to a map
*/
void SubproblemWorker::get_sol(Point &sol) const {
sol.clear();
std::vector<double> ptr(_solver->get_ncols());
void SubproblemWorker::get_sol(PlainData::Variables &vars) const {
vars.values = std::vector<double>(_solver->get_ncols());

if (_solver->get_n_integer_vars() > 0) {
_solver->get_mip_sol(ptr.data());
_solver->get_mip_sol(vars.values.data());
} else {
_solver->get_lp_sol(ptr.data(), NULL, NULL);
}
for (auto const &kvp : _id_to_name) {
sol[kvp.second] = ptr[kvp.first];
_solver->get_lp_sol(vars.values.data(), NULL, NULL);
}

vars.names = _solver->get_col_names();
}
24 changes: 18 additions & 6 deletions src/cpp/benders/benders_core/include/SubproblemCut.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,37 @@

#include "Worker.h"
#include "common.h"
namespace PlainData {
struct Variables {
std::vector<std::string> names;
std::vector<double> values;
template <class Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & names;
ar & values;
}
};

struct SubProblemData {
double subproblem_cost;
Point var_name_and_subgradient;
Point var_name_and_solution;
Variables variables;
double single_subpb_costs_under_approx;
double subproblem_timer;
int simplex_iter;
int lpstatus;
friend class boost::serialization::access;
template <class Archive>
void serialize(Archive &ar, const unsigned int version) {
ar &subproblem_cost;
ar & subproblem_cost;
ar & var_name_and_subgradient;
ar & var_name_and_solution;
ar & variables;
ar & single_subpb_costs_under_approx;
ar & subproblem_timer;
ar &simplex_iter;
ar &lpstatus;
ar & simplex_iter;
ar & lpstatus;
}
};
using SubProblemDataMap = std::map<std::string, SubProblemData>;
} // namespace PlainData

using SubProblemDataMap = std::map<std::string, PlainData::SubProblemData>;
2 changes: 1 addition & 1 deletion src/cpp/benders/benders_core/include/SubproblemWorker.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class SubproblemWorker : public Worker {
SolverLogManager&solver_log_manager,
Logger logger);
virtual ~SubproblemWorker() = default;
void get_sol(Point &sol) const;
void get_sol(PlainData::Variables &vars) const;

public:
void fix_to(Point const &x0) const;
Expand Down

0 comments on commit 98f3d20

Please sign in to comment.