EllAlgo 1.6.13
Loading...
Searching...
No Matches
lmi_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
27template <typename Arr036, typename Mat = Arr036> class LmiOracle
28 : public LmiOracleBase<Arr036, Mat> {
30 using Cut = std::pair<Arr036, double>;
31
32 LDLTMgr _mgr;
33 const std::vector<Mat>& m_F;
34 Mat m_F0;
35
36 public:
44 LmiOracle(size_t ndim, const std::vector<Mat>& F, Mat B)
45 : _mgr{ndim}, m_F{F}, m_F0{std::move(B)} {}
46
53 auto assess_feas(const Arr036& x) -> Cut* {
54 const auto n = x.size();
55
56 auto getA = [&n, &x, this](size_t i, size_t j) -> double {
57 auto a = this->m_F0(i, j);
58 for (auto k = 0U; k != n; ++k) {
59 a -= this->m_F[k](i, j) * x[k];
60 }
61 return a;
62 };
63
64 return this->assess_impl(this->_mgr, this->m_F, +1, x, getA);
65 }
66
73 auto operator()(const Arr036& x) -> Cut* { return assess_feas(x); }
74};
LDLT factorization.
Definition ldlt_mgr.hpp:33
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
Oracle for Linear Matrix Inequality.
Definition lmi_oracle.hpp:28
auto assess_feas(const Arr036 &x) -> Cut *
Definition lmi_oracle.hpp:53
auto operator()(const Arr036 &x) -> Cut *
Call operator wrapping assess_feas.
Definition lmi_oracle.hpp:73
LmiOracle(size_t ndim, const std::vector< Mat > &F, Mat B)
Construct a new lmi oracle object.
Definition lmi_oracle.hpp:44
auto invalid_value() -> T
Return an invalid/sentinel value for type T.
Definition cutting_plane.hpp:27
Shared LMI oracle skeleton (Template Method)