ZonoOpt 2.4.0
Loading...
Searching...
No Matches
GurobiSettings.hpp
Go to the documentation of this file.
1#ifndef ZONOOPT_GUROBI_SETTINGS_HPP_
2#define ZONOOPT_GUROBI_SETTINGS_HPP_
3
19#include <map>
20#include <optional>
21#include <sstream>
22#include <stdexcept>
23#include <string>
24
26
27namespace ZonoOpt
28{
29 // Forward declarations so GurobiSettings can check availability inline without
30 // pulling in GurobiSolver.hpp (which depends on this file).
31 namespace detail
32 {
33 bool gurobi_available();
34 const std::string& gurobi_unavailable_reason();
35 }
36
43 {
44 // ---- Termination ----
45 std::optional<double> TimeLimit;
46 std::optional<double> WorkLimit;
47 std::optional<double> MemLimit;
48 std::optional<int> SolutionLimit;
49
50 // ---- Tolerances ----
51 std::optional<double> MIPGap;
52 std::optional<double> MIPGapAbs;
53 std::optional<double> FeasibilityTol;
54 std::optional<double> OptimalityTol;
55 std::optional<double> IntFeasTol;
56
57 // ---- Algorithm selection / behavior ----
58 std::optional<int> Method;
59 std::optional<int> Presolve;
60 std::optional<int> Cuts;
61 std::optional<int> MIPFocus;
62 std::optional<int> NumericFocus;
63 std::optional<double> Heuristics;
64 std::optional<int> Threads;
65 std::optional<int> Seed;
66
67 // ---- Solution pool (used by mi_opt_multisol) ----
68 std::optional<int> PoolSolutions;
69 std::optional<int> PoolSearchMode;
70 std::optional<double> PoolGap;
71 std::optional<double> PoolGapAbs;
72
73 // ---- Logging ----
74 std::optional<int> OutputFlag;
75 std::optional<int> LogToConsole;
76 std::optional<std::string> LogFile;
77
78 // ---- Escape hatch for any Gurobi parameter not exposed above ----
79 // Keys are the documented Gurobi parameter names, e.g.,
80 // int_params["BarIterLimit"] = 500;
81 // dbl_params["NodefileStart"] = 0.5;
82 // str_params["WLSAccessID"] = "...";
83 // See https://docs.gurobi.com/projects/optimizer/en/current/reference/parameters.html
84 std::map<std::string, int> int_params;
85 std::map<std::string, double> dbl_params;
86 std::map<std::string, std::string> str_params;
87
88 // polymorphic copy
89 std::unique_ptr<SolverSettings> clone() const override
90 {
91 return std::make_unique<GurobiSettings>(*this);
92 }
93
94 // throws if the Gurobi shared library cannot be dynamically loaded
95 void verify_available() const override
96 {
97 if (!detail::gurobi_available())
98 {
99 throw std::runtime_error("GurobiSettings: " + detail::gurobi_unavailable_reason());
100 }
101 }
102
106 std::string print() const
107 {
108 std::stringstream ss;
109 ss << "GurobiSettings (unset fields use Gurobi defaults):\n";
110 auto opt_int = [&](const char* n, const std::optional<int>& v) { if (v) ss << " " << n << " = " << *v << "\n"; };
111 auto opt_dbl = [&](const char* n, const std::optional<double>& v) { if (v) ss << " " << n << " = " << *v << "\n"; };
112 auto opt_str = [&](const char* n, const std::optional<std::string>& v) { if (v) ss << " " << n << " = \"" << *v << "\"\n"; };
113
114 opt_dbl("TimeLimit", TimeLimit);
115 opt_dbl("WorkLimit", WorkLimit);
116 opt_dbl("MemLimit", MemLimit);
117 opt_int("SolutionLimit", SolutionLimit);
118
119 opt_dbl("MIPGap", MIPGap);
120 opt_dbl("MIPGapAbs", MIPGapAbs);
121 opt_dbl("FeasibilityTol", FeasibilityTol);
122 opt_dbl("OptimalityTol", OptimalityTol);
123 opt_dbl("IntFeasTol", IntFeasTol);
124
125 opt_int("Method", Method);
126 opt_int("Presolve", Presolve);
127 opt_int("Cuts", Cuts);
128 opt_int("MIPFocus", MIPFocus);
129 opt_int("NumericFocus", NumericFocus);
130 opt_dbl("Heuristics", Heuristics);
131 opt_int("Threads", Threads);
132 opt_int("Seed", Seed);
133
134 opt_int("PoolSolutions", PoolSolutions);
135 opt_int("PoolSearchMode", PoolSearchMode);
136 opt_dbl("PoolGap", PoolGap);
137 opt_dbl("PoolGapAbs", PoolGapAbs);
138
139 opt_int("OutputFlag", OutputFlag);
140 opt_int("LogToConsole", LogToConsole);
141 opt_str("LogFile", LogFile);
142
143 for (const auto& kv : int_params) ss << " [int] " << kv.first << " = " << kv.second << "\n";
144 for (const auto& kv : dbl_params) ss << " [dbl] " << kv.first << " = " << kv.second << "\n";
145 for (const auto& kv : str_params) ss << " [str] " << kv.first << " = \"" << kv.second << "\"\n";
146 return ss.str();
147 }
148
154
155 std::string solver_name() const override
156 {
157 return "Gurobi";
158 }
159 };
160
169 {
171 int status = 0;
172
174 double iter_count = 0.0;
175
177 double node_count = 0.0;
178
180 double mip_gap = 0.0;
181
183 double obj_bound = 0.0;
184
185 std::shared_ptr<ExternalSolverResults> clone() const override
186 {
187 return std::make_shared<GurobiSolverResults>(*this);
188 }
189
190 std::string print() const override
191 {
192 std::stringstream ss;
193 ss << "GurobiSolverResults:\n";
194 ss << " status: " << status << "\n";
195 ss << " iter_count: " << iter_count << "\n";
196 ss << " node_count: " << node_count << "\n";
197 ss << " mip_gap: " << mip_gap << "\n";
198 ss << " obj_bound: " << obj_bound << "\n";
199 return ss.str();
200 }
201 };
202} // namespace ZonoOpt
203
204#endif
int n
Definition GurobiSolver.cpp:83
Optimization settings and solution data structures for ZonoOpt library.
Definition ZonoOpt.hpp:58
Abstract base for external-solver-specific solution metadata.
Definition SolverDataStructures.hpp:267
Settings for the dynamically-loaded Gurobi solver backend.
Definition GurobiSettings.hpp:43
std::optional< int > NumericFocus
0..3 numerical-care knob
Definition GurobiSettings.hpp:62
std::optional< double > Heuristics
MIP heuristics effort (0..1)
Definition GurobiSettings.hpp:63
std::map< std::string, double > dbl_params
Definition GurobiSettings.hpp:85
std::optional< double > MIPGap
relative MIP optimality gap
Definition GurobiSettings.hpp:51
std::optional< int > Presolve
-1 auto, 0 off, 1 conservative, 2 aggressive
Definition GurobiSettings.hpp:59
void verify_available() const override
Verify the solver backend selected by this settings type is usable.
Definition GurobiSettings.hpp:95
std::optional< double > MIPGapAbs
absolute MIP optimality gap
Definition GurobiSettings.hpp:52
std::string solver_name() const override
Return name of the solver backend selected by this settings type, e.g., "ZonoOpt",...
Definition GurobiSettings.hpp:155
GurobiSettings()
Construct a new Gurobi Settings object.
Definition GurobiSettings.hpp:153
std::optional< int > MIPFocus
0 default, 1 feasibility, 2 optimality, 3 bound
Definition GurobiSettings.hpp:61
std::optional< int > PoolSolutions
Definition GurobiSettings.hpp:68
std::optional< double > FeasibilityTol
constraint feasibility tolerance
Definition GurobiSettings.hpp:53
std::optional< int > OutputFlag
0 silent, 1 verbose (Gurobi default 1)
Definition GurobiSettings.hpp:74
std::optional< double > TimeLimit
wall-clock time limit in seconds
Definition GurobiSettings.hpp:45
std::string print() const
displays the parameters that have been explicitly set
Definition GurobiSettings.hpp:106
std::optional< double > WorkLimit
deterministic work limit
Definition GurobiSettings.hpp:46
std::optional< double > OptimalityTol
dual feasibility tolerance
Definition GurobiSettings.hpp:54
std::optional< double > PoolGap
Definition GurobiSettings.hpp:70
std::optional< double > MemLimit
memory limit in GB
Definition GurobiSettings.hpp:47
std::optional< int > LogToConsole
Definition GurobiSettings.hpp:75
std::unique_ptr< SolverSettings > clone() const override
Polymorphic copy. Must be overridden by every concrete subclass.
Definition GurobiSettings.hpp:89
std::optional< int > Seed
random seed
Definition GurobiSettings.hpp:65
std::map< std::string, int > int_params
Definition GurobiSettings.hpp:84
std::optional< int > Cuts
global cut aggressiveness: -1..3
Definition GurobiSettings.hpp:60
std::optional< int > Method
root-node algorithm: -1 auto, 0..5
Definition GurobiSettings.hpp:58
std::optional< double > PoolGapAbs
Definition GurobiSettings.hpp:71
std::optional< int > PoolSearchMode
Definition GurobiSettings.hpp:69
std::map< std::string, std::string > str_params
Definition GurobiSettings.hpp:86
std::optional< int > Threads
worker thread count; 0 = auto
Definition GurobiSettings.hpp:64
std::optional< int > SolutionLimit
stop after this many MIP solutions
Definition GurobiSettings.hpp:48
std::optional< std::string > LogFile
Definition GurobiSettings.hpp:76
std::optional< double > IntFeasTol
integer feasibility tolerance
Definition GurobiSettings.hpp:55
Solver-native solution metadata produced by the Gurobi backend.
Definition GurobiSettings.hpp:169
int status
Raw Gurobi status code (see Gurobi's status code table).
Definition GurobiSettings.hpp:171
double iter_count
Simplex / barrier iteration count (Gurobi attribute "IterCount").
Definition GurobiSettings.hpp:174
double mip_gap
Relative MIP optimality gap achieved at termination (Gurobi attribute "MIPGap").
Definition GurobiSettings.hpp:180
double node_count
Number of branch-and-bound nodes explored (Gurobi attribute "NodeCount").
Definition GurobiSettings.hpp:177
std::shared_ptr< ExternalSolverResults > clone() const override
Polymorphic copy; required so callers can deep-copy an OptSolution.
Definition GurobiSettings.hpp:185
double obj_bound
Best dual bound found for the MIP (Gurobi attribute "ObjBound").
Definition GurobiSettings.hpp:183
std::string print() const override
Human-readable summary of the solver-specific fields.
Definition GurobiSettings.hpp:190
Abstract base for all solver settings.
Definition SolverDataStructures.hpp:35