11// -*- coding: utf-8 -*-
22#pragma once
33
4- #include < gsl/span>
5- #include < optional>
6-
74#include " ldlt_ext.hpp"
5+ #include < gsl/span>
6+ #include < memory> // for unique_ptr
87
98/* *
109 * @brief Oracle for Linear Matrix Inequality.
1413 * find x
1514 * s.t. (B - F * x) >= 0
1615 */
17- template <typename Mat> class LmiOracle {
18- // using Arr = xt::xarray<double, xt::layout_type::row_major>;
19- // using Cut = std::pair<Arr036, double>;
16+ template <typename Arr036, typename Mat = Arr036> class LmiOracle {
17+ using Cut = std::pair<Arr036, double >;
2018
2119private:
2220 ldlt_ext _Q;
2321 const gsl::span<const Mat> _F;
2422 const Mat _F0;
23+ std::unique_ptr<Cut> cut;
2524
2625public:
2726 /* *
@@ -31,17 +30,15 @@ template <typename Mat> class LmiOracle {
3130 * @param[in] B
3231 */
3332 LmiOracle (size_t dim, gsl::span<const Mat> F, Mat B)
34- : _Q{dim}, _F{F}, _F0{std::move (B)} {}
33+ : _Q{dim}, _F{F}, _F0{std::move (B)}, cut{std::make_unique<Cut>()} {}
3534
3635 /* *
3736 * @brief
3837 *
3938 * @param[in] x
4039 * @return std::optional<Cut>
4140 */
42- template <typename Arr036>
43- auto assess_feas (const Arr036 &x)
44- -> std::optional<std::pair<Arr036, double>> {
41+ auto assess_feas (const Arr036 &x) -> Cut * {
4542 const auto n = x.size ();
4643
4744 auto getA = [&, this ](size_t i, size_t j) -> double {
@@ -53,15 +50,17 @@ template <typename Mat> class LmiOracle {
5350 };
5451
5552 if (this ->_Q .factor (getA)) {
56- return {} ;
53+ return nullptr ;
5754 }
58- auto ep = this ->_Q .witness ();
55+ auto ep = this ->_Q .witness (); // call before sym_quad() !!!
5956 Arr036 g = x;
6057 // auto g = Arr036(x.size(), 0.0);
6158 for (auto i = 0U ; i != n; ++i) {
6259 g[i] = this ->_Q .sym_quad (this ->_F [i]);
6360 }
64- return {{std::move (g), ep}};
61+ cut->first = std::move (g);
62+ cut->second = std::move (ep);
63+ return cut.get ();
6564 }
6665
6766 /* *
@@ -70,8 +69,5 @@ template <typename Mat> class LmiOracle {
7069 * @param[in] x
7170 * @return std::optional<Cut>
7271 */
73- template <typename Arr036>
74- auto operator ()(const Arr036 &x) -> std::optional<std::pair<Arr036, double>> {
75- return assess_feas (x);
76- }
72+ auto operator ()(const Arr036 &x) -> Cut * { return assess_feas (x); }
7773};
0 commit comments