ZonoOpt v2.0.1
Loading...
Searching...
No Matches
ADMM.hpp
Go to the documentation of this file.
1#ifndef ZONOOPT_ADMM_HPP_
2#define ZONOOPT_ADMM_HPP_
3
16#include <vector>
17#include <chrono>
18#include <stdexcept>
19#include <iostream>
20#include <sstream>
21#include <memory>
22#include <set>
23#include <cmath>
24#include <atomic>
25
26#include "Eigen/Dense"
27#include "Eigen/Sparse"
28#include "CholeskyUtilities.hpp"
29#include "Intervals.hpp"
32
33/*
34 Primary reference:
35 Boyd, Stephen, et al.
36 "Distributed optimization and statistical learning via the alternating direction method of multipliers."
37 Foundations and TrendsĀ® in Machine learning 3.1 (2011): 1-122.
38*/
39
40namespace ZonoOpt::detail {
45 struct ADMM_data : std::enable_shared_from_this<ADMM_data>
46 {
47 Eigen::SparseMatrix<zono_float> P, A, AT;
48 Eigen::SparseMatrix<zono_float, Eigen::RowMajor> A_rm;
49 Eigen::Vector<zono_float, -1> q, b;
50 Eigen::Vector<zono_float, 1> c;
51 LDLT_data ldlt_data_M, ldlt_data_AAT;
52 int n_x, n_cons;
53 zono_float sqrt_n_x;
54 std::shared_ptr<Box> x_box;
55 OptSettings settings;
56
57 // constructor
58 ADMM_data() = default;
59
60 ADMM_data(const Eigen::SparseMatrix<zono_float>& P, const Eigen::Vector<zono_float, -1>& q,
61 const Eigen::SparseMatrix<zono_float>& A, const Eigen::Vector<zono_float, -1>& b,
62 const Eigen::Vector<zono_float, -1>& x_l, const Eigen::Vector<zono_float, -1>& x_u,
63 const zono_float c=0, const OptSettings& settings= OptSettings())
64 {
65 set(P, q, A, b, x_l, x_u, c, settings);
66 }
67
68 // set method
69 void set(const Eigen::SparseMatrix<zono_float>& P, const Eigen::Vector<zono_float, -1>& q,
70 const Eigen::SparseMatrix<zono_float>& A, const Eigen::Vector<zono_float, -1>& b,
71 const Eigen::Vector<zono_float, -1>& x_l, const Eigen::Vector<zono_float, -1>& x_u,
72 zono_float c=0, const OptSettings& settings= OptSettings());
73
74 // clone method
75 ADMM_data* clone() const;
76 };
77
78 // utilities
79
84 class ADMM_solver
85 {
86 public:
87
93 explicit ADMM_solver(const ADMM_data& data);
94
100 explicit ADMM_solver(const std::shared_ptr<ADMM_data>& data);
101
107 ADMM_solver(const ADMM_solver& other);
108
113 virtual ~ADMM_solver() = default;
114
121 virtual void warmstart(const Eigen::Vector<zono_float, -1>& x0,
122 const Eigen::Vector<zono_float, -1>& u0);
123
128 virtual void factorize();
129
136 OptSolution solve(std::atomic<bool>* stop);
137 OptSolution solve();
138
139 protected:
140
141 // protected fields
142 std::shared_ptr<ADMM_data> data;
143 zono_float eps_prim=static_cast<zono_float>(1e-3), eps_dual=static_cast<zono_float>(1e-3);
144
145 // startup method
146 bool startup(Box& x_box, OptSolution& solution, const std::set<int>& contract_inds=std::set<int>());
147
148 // core solve method
149 virtual void solve_core(const Box& x_box, OptSolution& solution, std::atomic<bool>* stop);
150
151 // warm start
152 Eigen::Vector<zono_float, -1> x0, u0;
153
154 // flags
155 bool is_warmstarted = false;
156
157 // factor problem data
158 void factorize_M() const;
159
160 void factorize_AAT() const;
161
162 // check for infeasibility certificate
163 bool is_infeasibility_certificate(const Eigen::Vector<zono_float, -1>& ek,
164 const Eigen::Vector<zono_float, -1>& xk, const Box& x_box) const;
165
166 bool check_problem_dimensions() const;
167 };
168
169} // end namespace ZonoOpt::detail
170
171#endif
Internal utilities for Cholesky factorization using Eigen's LDLT solver.
Interval and box classes.
Optimization settings and solution data structures for ZonoOpt library.
Utilities for sparse matrix operations in ZonoOpt library.
#define zono_float
Defines the floating-point type used in ZonoOpt.
Definition ZonoOpt.hpp:45