swh:1:snp:7a4cd2a5ec73a061be17605597c4b1660b799026
Tip revision: 233199f30c14fad60720f2922760075eced625fe authored by Max Göttlicher on 19 April 2023, 17:53:20 UTC
greedy upper bounds
greedy upper bounds
Tip revision: 233199f
gurobi_solve.hpp
//
// Created by max on 25.07.22.
//
#ifndef PDS_GUROBI_SOLVE_HPP
#define PDS_GUROBI_SOLVE_HPP
#include <range/v3/all.hpp>
#include "pds.hpp"
// Forward declaration to avoid full gurobi header inclusion
struct GRBModel;
struct GRBVar;
namespace pds {
inline const double TIME_LIMIT = 10 * 60;
struct MIPModel {
std::unique_ptr<GRBModel> model;
map<PowerGrid::VertexDescriptor, GRBVar> xi;
MIPModel();
MIPModel(MIPModel&& other) = default;
virtual ~MIPModel();
};
void preloadMIPSolver();
void relaxMIPModel(MIPModel&);
MIPModel modelJovanovic(PdsState& state);
MIPModel modelJovanovicExpanded(PdsState& state);
MIPModel modelDomination(PdsState& state);
MIPModel modelBrimkov(PdsState& state);
MIPModel modelBrimkovExpanded(PdsState& state);
MIPModel modelAzamiBrimkov(PdsState& state);
SolveResult solveMIP(MIPModel&, bool output = false, double timeLimit = TIME_LIMIT);
SolveResult solveBozeman(PdsState &state, int output, double timeLimit, int fortGenerator, int greedyUpper);
void applySolution(PdsState&, MIPModel& model);
template<class F = decltype(modelJovanovicExpanded)>
//requires std::is_invocable_v<PdsState&>
inline SolveResult solvePowerDominatingSet(PdsState& state, bool output, double timeLimit, F model = modelJovanovicExpanded) {
auto mip = model(state);
auto result = solveMIP(mip, output, timeLimit);
if (result.state != SolveState::Infeasible) {
applySolution(state, mip);
}
return result;
}
//inline SolveState solve_pds(PdsState& state, bool output = false, double timeLimit = TIME_LIMIT) {
// return solve_pds(state, output, timeLimit, modelJovanovicExpanded);
//}
} //namespace pds
#endif //PDS_GUROBI_SOLVE_HPP