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);
162 virtual void factorize();
172 OptSolution solve(std::atomic<bool>* stop);
178 std::shared_ptr<ADMM_data> data;
182 bool startup(Box& x_box, OptSolution& solution,
const std::set<int>& contract_inds = std::set<int>());
185 virtual void solve_core(
const Box& x_box, OptSolution& solution, std::atomic<bool>* stop);
191 bool is_warmstarted =
false;
194 void factorize_M()
const;
196 void factorize_AAT()
const;
199 bool is_infeasibility_certificate(
const Eigen::Vector<zono_float, -1>& ek,
200 const Eigen::Vector<zono_float, -1>& xk,
const Box& x_box)
const;
202 bool check_problem_dimensions()
const;
209 class ADMM_FP_solver :
public ADMM_solver
212 std::mt19937 rand_gen;
214 void init_rand_gen();
222 ADMM_FP_solver(
const std::shared_ptr<ADMM_data>& data);
228 ADMM_FP_solver(
const ADMM_data& data);
235 ADMM_FP_solver(
const ADMM_FP_solver& other) =
default;
245 void solve_core(
const Box& x_box, OptSolution& solution, std::atomic<bool>* stop)
override;
247 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.
Eigen::SparseMatrix< double, Eigen::RowMajor > A_rm
Definition GurobiSolver.cpp:369
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 the internal ZonoOpt ADMM / branch-and-bound solver.
Definition SolverDataStructures.hpp:68
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