ZonoOpt 2.4.1
Loading...
Searching...
No Matches
SolverDataStructures.hpp
Go to the documentation of this file.
1#ifndef ZONOOPT_SOLVER_DATA_STRUCUTURES_HPP_
2#define ZONOOPT_SOLVER_DATA_STRUCUTURES_HPP_
3
15#include <Eigen/Dense>
16#include <memory>
17#include <sstream>
18#include <string>
19
20namespace ZonoOpt
21{
35 {
36 virtual ~SolverSettings() = default;
37
41 virtual std::unique_ptr<SolverSettings> clone() const = 0;
42
53 virtual void verify_available() const {}
54
60 virtual std::string solver_name() const = 0;
61 };
62
68 {
69 // general settings
70
72 bool verbose = false;
73
76
78 double t_max = std::numeric_limits<double>::max();
79
80 // ADMM settings
81
83 int k_max_admm = 5000;
84
86 zono_float rho = static_cast<zono_float>(10.0);
87
89 zono_float eps_dual = static_cast<zono_float>(1e-2);
90
92 zono_float eps_prim = static_cast<zono_float>(1e-3);
93
95 int k_inf_check = 10;
96
98 bool inf_norm_conv = true;
99
102
105
106 // mixed integer settings
107
109 int search_mode = 0;
110
112 bool polish = true;
113
116
119
121 zono_float eps_r = static_cast<zono_float>(1e-2);
122
124 zono_float eps_a = static_cast<zono_float>(1e-1);
125
127 int k_max_bnb = static_cast<int>(1e5);
128
131
134
137
139 int max_nodes = static_cast<int>(1e5);
140
143
146
149
151 int k_max_admm_fp_ph1 = 10000;
152
154 int k_max_admm_fp_ph2 = 90000;
155
158
160 zono_float eps_perturb = static_cast<zono_float>(1e-3);
161
163 int k_restart = 5000;
164
166 bool enable_rng_seed = false;
167
169 unsigned int rng_seed = 0;
170
171 // polymorphic copy
172 std::unique_ptr<SolverSettings> clone() const override
173 {
174 return std::make_unique<OptSettings>(*this);
175 }
176
177 // validity check
183 bool settings_valid() const
184 {
185 const bool general_valid = t_max > 0 && verbosity_interval > 0;
186 const bool admm_valid = (rho > 0 && k_max_admm > 0 &&
187 eps_dual >= 0 && eps_prim >= 0 && k_inf_check >= 0 && contractor_iter > 0);
188 const bool mi_valid = (eps_r >= 0 && eps_a >= 0 && eps_dual_search > 0 && eps_prim_search > 0 &&
189 k_max_bnb > 0 && n_threads_bnb >= 0 && n_threads_admm_fp >= 0 && max_nodes > 0 &&
192 (search_mode == 0 || search_mode == 1) &&
193 eps_perturb > 0);
194
195 return (general_valid && admm_valid && mi_valid);
196 }
197
203 std::string print() const
204 {
205 std::stringstream ss;
206 ss << "OptSettings structure: " << std::endl;
207 ss << " verbose: " << (verbose ? "true" : "false") << std::endl;
208 ss << " verbosity_interval: " << verbosity_interval << std::endl;
209 ss << " t_max: " << t_max << std::endl;
210 ss << " k_max_admm: " << k_max_admm << std::endl;
211 ss << " rho: " << rho << std::endl;
212 ss << " eps_dual: " << eps_dual << std::endl;
213 ss << " eps_prim: " << eps_prim << std::endl;
214 ss << " k_inf_check: " << k_inf_check << std::endl;
215 ss << " inf_norm_conv: " << (inf_norm_conv ? "true" : "false") << std::endl;
216 ss << " use_interval_contractor: " << (use_interval_contractor ? "true" : "false") << std::endl;
217 ss << " contractor_iter: " << contractor_iter << std::endl;
218 ss << " search_mode: " << search_mode << std::endl;
219 ss << " polish: " << polish << std::endl;
220 ss << " eps_dual_search: " << eps_dual_search << std::endl;
221 ss << " eps_prim_search: " << eps_prim_search << std::endl;
222 ss << " eps_r: " << eps_r << std::endl;
223 ss << " eps_a: " << eps_a << std::endl;
224 ss << " k_max_bnb: " << k_max_bnb << std::endl;
225 ss << " n_threads_bnb: " << n_threads_bnb << std::endl;
226 ss << " n_threads_admm_fp: " << n_threads_admm_fp << std::endl;
227 ss << " single_threaded_admm_fp: " << (single_threaded_admm_fp ? "true" : "false") << std::endl;
228 ss << " max_nodes: " << max_nodes << std::endl;
229 ss << " contractor_tree_search_depth: " << contractor_tree_search_depth << std::endl;
230 ss << " enable_perturb_admm_fp: " << (enable_perturb_admm_fp ? "true" : "false") << std::endl;
231 ss << " k_max_admm_fp_ph1: " << k_max_admm_fp_ph1 << std::endl;
232 ss << " k_max_admm_fp_ph2: " << k_max_admm_fp_ph2 << std::endl;
233 ss << " cycle_detection_buffer_size: " << cycle_detection_buffer_size << std::endl;
234 ss << " eps_perturb: " << eps_perturb << std::endl;
235 ss << " k_restart: " << k_restart << std::endl;
236 ss << " enable_rng_seed: " << (enable_rng_seed ? "true" : "false") << std::endl;
237 ss << " rng_seed: " << rng_seed << std::endl;
238 ss << " enable_restart_admm_fp: " << (enable_restart_admm_fp ? "true" : "false") << std::endl;
239 return ss.str();
240 }
241
242 std::string solver_name() const override
243 {
244 return "ZonoOpt";
245 }
246
251 OptSettings() = default;
252 };
253
267 {
268 virtual ~ExternalSolverResults() = default;
269
271 virtual std::shared_ptr<ExternalSolverResults> clone() const = 0;
272
274 virtual std::string print() const { return "ExternalSolverResults"; }
275 };
276
288 {
289 // general — always populated
290
292 Eigen::Vector<zono_float, -1> z;
293
295 zono_float J = -std::numeric_limits<zono_float>::infinity();
296
298 double run_time = 0.0;
299
301 bool converged = false;
302
304 bool infeasible = false;
305
306 // admm-specific — meaningful only when the internal solver was used.
307
309 double startup_time = 0.0;
310
312 int iter = 0;
313
315 Eigen::Vector<zono_float, -1> x;
316
318 Eigen::Vector<zono_float, -1> u;
319
321 zono_float primal_residual = std::numeric_limits<zono_float>::infinity();
322
324 zono_float dual_residual = std::numeric_limits<zono_float>::infinity();
325
326 // external-solver-specific — populated only when an external solver was used.
327
331 std::shared_ptr<ExternalSolverResults> external_results;
332
338 std::string print() const
339 {
340 std::stringstream ss;
341 ss << "OptSolution structure:" << std::endl;
342 ss << " z: vector of length " << z.size() << std::endl;
343 ss << " J: " << J << std::endl;
344 ss << " run_time: " << run_time << std::endl;
345 ss << " startup_time: " << startup_time << std::endl;
346 ss << " iter: " << iter << std::endl;
347 ss << " converged: " << (converged ? "true" : "false") << std::endl;
348 ss << " infeasible: " << (infeasible ? "true" : "false") << std::endl;
349 ss << " x: vector of length " << x.size() << std::endl;
350 ss << " u: vector of length " << u.size() << std::endl;
351 ss << " primal_residual: " << primal_residual << std::endl;
352 ss << " dual_residual: " << dual_residual << std::endl;
354 ss << " external_results: " << external_results->print() << std::endl;
355 return ss.str();
356 }
357 };
358
359 // ---- Program-wide default solver settings -------------------------------
360 //
361 // ZonoOpt's optimization methods take a SolverSettings argument whose default
362 // is whatever set_default_solver_settings() last installed. This lets a user
363 // switch the entire library to (e.g.) Gurobi by calling
364 // set_default_solver_settings(GurobiSettings{});
365 // once at program startup, instead of passing GurobiSettings to every call.
366 //
367 // Initial default is OptSettings() (internal ADMM/branch-and-bound).
368 //
369 // Not thread-safe: set_default_solver_settings should be called from a single
370 // thread at startup before parallel optimization begins. Existing const
371 // SolverSettings& references obtained from get_default_solver_settings() are
372 // invalidated by a subsequent set_default_solver_settings() call.
373
374 namespace detail
375 {
376 inline std::unique_ptr<SolverSettings>& default_settings_storage()
377 {
378 static std::unique_ptr<SolverSettings> p = std::make_unique<OptSettings>();
379 return p;
380 }
381 } // namespace detail
382
389 {
390 return *detail::default_settings_storage();
391 }
392
403 inline void set_default_solver_settings(const SolverSettings& settings)
404 {
405 settings.verify_available();
406 detail::default_settings_storage() = settings.clone();
407 }
408} // end namespace ZonoOpt
409
410#endif
#define zono_float
Defines the floating-point type used in ZonoOpt.
Definition ZonoOpt.hpp:45
Definition ZonoOpt.hpp:58
const SolverSettings & get_default_solver_settings()
Returns a reference to the current program-wide default solver settings.
Definition SolverDataStructures.hpp:388
void set_default_solver_settings(const SolverSettings &settings)
Replaces the program-wide default solver settings with a polymorphic copy of settings.
Definition SolverDataStructures.hpp:403
Abstract base for external-solver-specific solution metadata.
Definition SolverDataStructures.hpp:267
virtual std::shared_ptr< ExternalSolverResults > clone() const =0
Polymorphic copy; required so callers can deep-copy an OptSolution.
virtual std::string print() const
Human-readable summary of the solver-specific fields.
Definition SolverDataStructures.hpp:274
virtual ~ExternalSolverResults()=default
Settings for the internal ZonoOpt ADMM / branch-and-bound solver.
Definition SolverDataStructures.hpp:68
bool polish
flag to perform solution polishing
Definition SolverDataStructures.hpp:112
int k_inf_check
check infeasibility every k_inf_check iterations
Definition SolverDataStructures.hpp:95
int k_restart
perform restart operation if primal residual does not improve over this many iterations in ADMM-FP
Definition SolverDataStructures.hpp:163
bool use_interval_contractor
flag to use interval contractor for constraint tightening / implication
Definition SolverDataStructures.hpp:101
double t_max
max time for optimization
Definition SolverDataStructures.hpp:78
int k_max_bnb
max number of branch-and-bound iterations
Definition SolverDataStructures.hpp:127
unsigned int rng_seed
rng seed for ADMM-FP
Definition SolverDataStructures.hpp:169
bool enable_rng_seed
enable rng seed for ADMM-FP
Definition SolverDataStructures.hpp:166
std::unique_ptr< SolverSettings > clone() const override
Polymorphic copy. Must be overridden by every concrete subclass.
Definition SolverDataStructures.hpp:172
int cycle_detection_buffer_size
in ADMM-FP, this is the max size of the buffer that checks for cycles
Definition SolverDataStructures.hpp:157
zono_float eps_r
relative convergence tolerance
Definition SolverDataStructures.hpp:121
bool enable_restart_admm_fp
enable restarts (significant perturbations) in ADMM-FP
Definition SolverDataStructures.hpp:148
zono_float eps_a
absolute convergence tolerance
Definition SolverDataStructures.hpp:124
bool verbose
display optimization progress
Definition SolverDataStructures.hpp:72
std::string print() const
displays settings as string
Definition SolverDataStructures.hpp:203
int n_threads_bnb
max threads for branch and bound
Definition SolverDataStructures.hpp:130
zono_float eps_prim_search
primal residual convergence tolerance during branch and bound and search
Definition SolverDataStructures.hpp:118
int contractor_tree_search_depth
when applying interval contractor in branch and bound, this is how deep to search the constraint tree...
Definition SolverDataStructures.hpp:142
zono_float eps_prim
primal convergence tolerance
Definition SolverDataStructures.hpp:92
int k_max_admm_fp_ph2
max ADMM iterations for ADMM-FP phase 2 (no objective)
Definition SolverDataStructures.hpp:154
OptSettings()=default
OptSettings constructor.
bool inf_norm_conv
use infinity norm for convergence check (if false, scaled 2-norm is used)
Definition SolverDataStructures.hpp:98
int verbosity_interval
print every verbose_interval iterations
Definition SolverDataStructures.hpp:75
zono_float rho
admm penalty parameter, higher prioritizes feasibility during iterations, lower prioritizes optimalit...
Definition SolverDataStructures.hpp:86
int k_max_admm_fp_ph1
max ADMM iterations for ADMM-FP phase 1 (objective included)
Definition SolverDataStructures.hpp:151
int k_max_admm
max convex admm iterations
Definition SolverDataStructures.hpp:83
zono_float eps_dual
dual convergence tolerance
Definition SolverDataStructures.hpp:89
std::string solver_name() const override
Return name of the solver backend selected by this settings type, e.g., "ZonoOpt",...
Definition SolverDataStructures.hpp:242
bool enable_perturb_admm_fp
enable perturbations in ADMM-FP
Definition SolverDataStructures.hpp:145
int max_nodes
terminate if more than this many nodes are in branch and bound queue
Definition SolverDataStructures.hpp:139
zono_float eps_perturb
relative tolerance for cycle detection, triggers perturbation
Definition SolverDataStructures.hpp:160
int search_mode
0: best first, 1: best dive
Definition SolverDataStructures.hpp:109
zono_float eps_dual_search
dual residual convergence tolerance during branch and bound and search
Definition SolverDataStructures.hpp:115
bool settings_valid() const
Checks whether settings struct is valid.
Definition SolverDataStructures.hpp:183
bool single_threaded_admm_fp
enables single-threaded ADMM-FP solution, overrides n_threads_bnb, n_threads_admm_fp
Definition SolverDataStructures.hpp:136
int contractor_iter
number of interval contractor iterations
Definition SolverDataStructures.hpp:104
int n_threads_admm_fp
max threads for ADMM-FP
Definition SolverDataStructures.hpp:133
Solution data structure for optimization routines in ZonoOpt library.
Definition SolverDataStructures.hpp:288
zono_float dual_residual
dual residual, corresponds to optimality
Definition SolverDataStructures.hpp:324
bool infeasible
true if optimization problem is provably infeasible
Definition SolverDataStructures.hpp:304
Eigen::Vector< zono_float, -1 > x
ADMM primal variable, approximately equal to z when converged.
Definition SolverDataStructures.hpp:315
Eigen::Vector< zono_float, -1 > z
solution vector
Definition SolverDataStructures.hpp:292
double run_time
time to compute solution (seconds)
Definition SolverDataStructures.hpp:298
std::string print() const
displays solution as string
Definition SolverDataStructures.hpp:338
zono_float J
objective
Definition SolverDataStructures.hpp:295
zono_float primal_residual
primal residual, corresponds to feasibility
Definition SolverDataStructures.hpp:321
std::shared_ptr< ExternalSolverResults > external_results
Definition SolverDataStructures.hpp:331
int iter
number of iterations
Definition SolverDataStructures.hpp:312
double startup_time
time to factorize matrices and run interval contractors
Definition SolverDataStructures.hpp:309
bool converged
true if optimization has converged (proved optimal for external solvers; satisfied tolerances for int...
Definition SolverDataStructures.hpp:301
Eigen::Vector< zono_float, -1 > u
ADMM dual variable.
Definition SolverDataStructures.hpp:318
Abstract base for all solver settings.
Definition SolverDataStructures.hpp:35
virtual void verify_available() const
Verify the solver backend selected by this settings type is usable.
Definition SolverDataStructures.hpp:53
virtual std::string solver_name() const =0
Return name of the solver backend selected by this settings type, e.g., "ZonoOpt",...
virtual std::unique_ptr< SolverSettings > clone() const =0
Polymorphic copy. Must be overridden by every concrete subclass.
virtual ~SolverSettings()=default