EllAlgo 1.6.13
Loading...
Searching...
No Matches
lmi0_oracle.hpp
Go to the documentation of this file.
1
6// -*- coding: utf-8 -*-
7#pragma once
8
9#include <utility> // for move
10#include <vector>
11
12#include "lmi_oracle_base.hpp"
13
32template <typename Arr036, typename Mat = Arr036> class Lmi0Oracle
33 : public LmiOracleBase<Arr036, Mat> {
35 using Cut = std::pair<Arr036, double>;
36
37 public:
39
40 private:
41 const std::vector<Mat>& m_F;
42
43 public:
50 Lmi0Oracle(size_t ndim, const std::vector<Mat>& F) : _mq(ndim), m_F{F} {}
51
62 auto assess_feas(const Arr036& x) -> Cut* {
63 const auto n = x.size();
64
65 auto getA = [&n, &x, this](size_t i, size_t j) -> double {
66 auto a = 0.0;
67 for (auto k = 0U; k != n; ++k) {
68 a += this->m_F[k](i, j) * x[k];
69 }
70 return a;
71 };
72
73 return this->assess_impl(this->_mq, this->m_F, -1, x, getA);
74 }
75
82 auto operator()(const Arr036& x) -> Cut* { return assess_feas(x); }
83};
LDLT factorization.
Definition ldlt_mgr.hpp:33
Oracle for Linear Matrix Inequality (LMI) feasibility problems.
Definition lmi0_oracle.hpp:33
auto assess_feas(const Arr036 &x) -> Cut *
Assess the feasibility of a given point.
Definition lmi0_oracle.hpp:62
auto operator()(const Arr036 &x) -> Cut *
Call operator wrapping assess_feas.
Definition lmi0_oracle.hpp:82
LDLTMgr _mq
LDLT manager for matrix factorization.
Definition lmi0_oracle.hpp:38
Lmi0Oracle(size_t ndim, const std::vector< Mat > &F)
Construct a new LMI Oracle object.
Definition lmi0_oracle.hpp:50
Shared skeleton for Linear Matrix Inequality oracles.
Definition lmi_oracle_base.hpp:31
auto assess_impl(LDLT &mgr, const std::vector< Mat > &F, const int sign, const Arr036 &x, Fn &&getA) -> Cut *
Shared assess_feas skeleton: factor, witness, sym_quad, pack cut.
Definition lmi_oracle_base.hpp:50
auto invalid_value() -> T
Return an invalid/sentinel value for type T.
Definition cutting_plane.hpp:27
Shared LMI oracle skeleton (Template Method)