1#ifndef ZONOOPT_ADMM_HPP_
2#define ZONOOPT_ADMM_HPP_
28#include "Eigen/Sparse"
63 struct ADMM_data : std::enable_shared_from_this<ADMM_data>
65 Eigen::SparseMatrix<zono_float> P, A, AT;
66 Eigen::SparseMatrix<zono_float, Eigen::RowMajor> A_rm;
68 Eigen::Vector<zono_float, 1> c;
69 LDLT_data ldlt_data_M, ldlt_data_AAT;
72 std::shared_ptr<Box> x_box;
76 ADMM_data() =
default;
78 ADMM_data(
const Eigen::SparseMatrix<zono_float>& P,
const Eigen::Vector<zono_float, -1>& q,
79 const Eigen::SparseMatrix<zono_float>& A,
const Eigen::Vector<zono_float, -1>& b,
80 const Eigen::Vector<zono_float, -1>& x_l,
const Eigen::Vector<zono_float, -1>& x_u,
83 set(P, q, A, b, x_l, x_u, c, settings);
87 void set(
const Eigen::SparseMatrix<zono_float>& P,
const Eigen::Vector<zono_float, -1>& q,
88 const Eigen::SparseMatrix<zono_float>& A,
const Eigen::Vector<zono_float, -1>& b,
89 const Eigen::Vector<zono_float, -1>& x_l,
const Eigen::Vector<zono_float, -1>& x_u,
93 ADMM_data* clone()
const;
106 const std::vector<zono_float>& get_vals()
const;
111 std::vector<zono_float> buffer;
126 explicit ADMM_solver(
const ADMM_data& data);
133 explicit ADMM_solver(
const std::shared_ptr<ADMM_data>& data);
140 ADMM_solver(
const ADMM_solver& other);
146 virtual ~ADMM_solver() =
default;
154 virtual void warmstart(
const Eigen::Vector<zono_float, -1>& x,
155 const Eigen::Vector<zono_float, -1>& u);
161 virtual void factorize();
169 OptSolution solve(std::atomic<bool>* stop);
175 std::shared_ptr<ADMM_data> data;
179 bool startup(Box& x_box, OptSolution& solution,
const std::set<int>& contract_inds = std::set<int>());
182 virtual void solve_core(
const Box& x_box, OptSolution& solution, std::atomic<bool>* stop);
188 bool is_warmstarted =
false;
191 void factorize_M()
const;
193 void factorize_AAT()
const;
196 bool is_infeasibility_certificate(
const Eigen::Vector<zono_float, -1>& ek,
197 const Eigen::Vector<zono_float, -1>& xk,
const Box& x_box)
const;
199 bool check_problem_dimensions()
const;
206 class ADMM_FP_solver :
public ADMM_solver
209 std::mt19937 rand_gen;
211 void init_rand_gen();
219 ADMM_FP_solver(
const std::shared_ptr<ADMM_data>& data);
225 ADMM_FP_solver(
const ADMM_data& data);
232 ADMM_FP_solver(
const ADMM_FP_solver& other) =
default;
242 void solve_core(
const Box& x_box, OptSolution& solution, std::atomic<bool>* stop)
override;
244 void ADMM_FP_core(
const MI_Box& x_box, OptSolution& solution, std::atomic<bool>* stop, FP_Phase phase);
Internal utilities for Cholesky factorization using Eigen's LDLT solver.
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
Definition ZonoOpt.hpp:58
Settings for optimization routines in ZonoOpt library.
Definition SolverDataStructures.hpp:25
Warm start parameters for optimization routines in ZonoOpt library.
Definition ADMM.hpp:49
Eigen::Vector< zono_float, -1 > z
primal variable
Definition ADMM.hpp:51
Eigen::Vector< zono_float, -1 > u
dual variable
Definition ADMM.hpp:54