EllAlgo 1.6.13
Loading...
Searching...
No Matches
lmi_problem.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <tuple> // for tuple
9#include <utility> // for move
10#include <valarray>
11#include <vector>
12
13#include "cutting_plane.hpp"
14#include "ell_stable.hpp"
16
33template <typename Arr036, typename Mat = Arr036> class LMIProblem {
34 using Vec = std::valarray<double>;
35
36 size_t _ndim;
37 std::vector<Mat> _F; // problem data, must precede _omega
38 Mat _B; // constant term
39 LmiOracle<Arr036, Mat> _omega; // holds a reference to _F
40
41 public:
49 LMIProblem(size_t ndim, std::vector<Mat> F, Mat B)
50 : _ndim{ndim}, _F{std::move(F)}, _B{std::move(B)}, _omega{ndim, _F, _B} {}
51
63 auto solve_feas(const Vec& radii, Arr036 xc, const Options& options = Options())
64 -> std::tuple<Arr036, size_t> {
65 EllStable<Arr036> space{radii, std::move(xc)};
66 return cutting_plane_feas(this->_omega, space, options);
67 }
68
77 auto solve_feas(double alpha, Arr036 xc, const Options& options = Options())
78 -> std::tuple<Arr036, size_t> {
79 EllStable<Arr036> space{alpha, std::move(xc)};
80 return cutting_plane_feas(this->_omega, space, options);
81 }
82};
83
94template <typename Arr036, typename Mat = Arr036>
95inline auto make_lmi_problem(size_t ndim, std::vector<Mat> F, Mat B) -> LMIProblem<Arr036, Mat> {
96 return {ndim, std::move(F), std::move(B)};
97}
Ellipsoid Search Space (stable strategy)
Definition ell_stable.hpp:24
LMI feasibility problem facade.
Definition lmi_problem.hpp:33
auto solve_feas(double alpha, Arr036 xc, const Options &options=Options()) -> std::tuple< Arr036, size_t >
Solve the LMI feasibility problem (alpha-scaled initial space).
Definition lmi_problem.hpp:77
auto solve_feas(const Vec &radii, Arr036 xc, const Options &options=Options()) -> std::tuple< Arr036, size_t >
Solve the LMI feasibility problem.
Definition lmi_problem.hpp:63
LMIProblem(size_t ndim, std::vector< Mat > F, Mat B)
Construct a new LMIProblem object.
Definition lmi_problem.hpp:49
Oracle for Linear Matrix Inequality.
Definition lmi_oracle.hpp:28
Cutting-plane methods for convex feasibility and optimization.
auto invalid_value() -> T
Return an invalid/sentinel value for type T.
Definition cutting_plane.hpp:27
auto cutting_plane_feas(O &omega, S &space, const Options &options=Options()) -> std::tuple< CuttingPlaneArrayType< S >, size_t >
Find a point in a convex set (defined through a cutting-plane oracle).
Definition cutting_plane.hpp:105
Numerically stable ellipsoid search space (LDL^T strategy)
Oracle for Linear Matrix Inequality feasibility (lazy matrix form)
auto make_lmi_problem(size_t ndim, std::vector< Mat > F, Mat B) -> LMIProblem< Arr036, Mat >
Create an LMIProblem facade.
Definition lmi_problem.hpp:95
Configuration options for the ellipsoid algorithm.
Definition ell_config.hpp:19