8#include "akreon/linalg/assert.hpp"
10#include "akreon/convex/composed/quad_form.hpp"
11#include "akreon/convex/convex_problem.hpp"
12#include "akreon/convex/intersection.hpp"
13#include "akreon/convex/sets/lmi.hpp"
14#include "akreon/convex/variable.hpp"
15#include "akreon/linalg/operator/matrix_inverse.hpp"
16#include "akreon/linalg/operator/matrix_pencil.hpp"
40template <ContinuousPlantModelLike Plant, std::
size_t N>
42 using Model = linalg::remove_cvref_t<Plant>;
50 using QMat = linalg::Matrix<T, StateDim, StateDim>;
51 using WMat = linalg::Matrix<T, StateDim, OutputDim>;
52 using LMat = linalg::Matrix<T, StateDim, OutputDim>;
59 using ZSpace = linalg::RowVector<T, ZDim>;
60 using Fs = linalg::Vector<FMat, ZDim>;
71 template <convex::AtomLike Var>
85 template <convex::AtomLike Var>
88 static_assert(convex::is_var_type_v<Var>,
"Input atom is not a var");
89 using ZDom = convex::meta_dom_t<convex::atom_meta_t<Var>>;
90 static_assert(convex::dom_vartype_v<ZDom> == convex::VarType::FREE,
91 "Merged decision var must be free");
92 using ZVarSpace = convex::dom_space_t<ZDom>;
93 static_assert(std::same_as<ZVarSpace, ZSpace>,
94 "Expected merged decision size [svec(Q); vec(W)]");
103 std::index_sequence<
Is...>) {
104 return convex::Intersection(
q_lmi,
119 template <convex::AtomLike ZVar>
121 const auto I = linalg::make_identity<T, StateDim>();
141 template <convex::AtomLike ZVar>
144 const auto A =
plant.dynamics_matrix();
145 return T(-1) * (linalg::transpose(A) *
E +
E * A);
149 const auto C_y =
plant.measurement_matrix();
150 return E *
C_y + linalg::transpose(
C_y) * linalg::transpose(
E);
176 const auto [
Q_inv,
event] = linalg::SymmetricMatrixInverse<QMat>()(
Q);
177 if (
event != linalg::NumericalEvent::NONE)
return std::tuple(
LMat{},
event);
179 return std::tuple(
L, linalg::NumericalEvent::NONE);
194template <ContinuousPlantModelLike Plant, std::
size_t N, convex::AtomLike ZVar>
201 return convex::make_quad_form(
P,
q,
Z);
214template <ContinuousPlantModelLike Plant, std::
size_t N, convex::AtomLike ZVar>
216 const linalg::Vector<Plant, N>&
poly,
const ZVar&
Z,
const auto&
obj,
219 return convex::make_problem(
Z).in_set(
pldi).minimize(
obj);
231template <ContinuousPlantModelLike Plant, std::
size_t N, convex::AtomLike ZVar>
233 const linalg::Vector<Plant, N>&
poly,
const ZVar&
Z,
236 return convex::make_problem(
Z).in_set(
pldi).feasibility();
constexpr bool is_continuous_v
check if continuous or not
typename plant_traits< linalg::remove_cvref_t< Plant > >::State plant_state_vec_t
extract state vector from plant
constexpr auto make_polytopic_observer_quadratic_objective(const linalg::Matrix< plant_type_t< Plant >, PolytopicObserver< Plant, N >::ZDim, PolytopicObserver< Plant, N >::ZDim > &P, const linalg::Vector< plant_type_t< Plant >, PolytopicObserver< Plant, N >::ZDim > &q, const ZVar &Z)
make quadratic objective over merged PLDI variable
typename plant_traits< linalg::remove_cvref_t< Plant > >::T plant_type_t
extract scalar type from plant
constexpr auto make_polytopic_observer_problem(const linalg::Vector< Plant, N > &poly, const ZVar &Z, const auto &obj, plant_type_t< Plant > margin=1e-6)
make PLDI problem with objective
Polytopic Luenberger Observer.
constexpr auto q_constraint(const ZVar &Z, T margin=1e-6) const
q_constraint
linalg::Vector< FMat, ZDim > Fs
static constexpr std::size_t OutputDim
static constexpr std::size_t StateDim
constexpr auto L(const QMat &Q, const WMat &W) const
L.
linalg::RowVector< T, ZDim > ZSpace
constexpr auto apply(const Polytope &poly, const Var &Z, T margin=1e-6) const
apply
linalg::Vector< Plant, N > Polytope
static constexpr std::size_t WDim
static constexpr std::size_t QDim
linalg::remove_cvref_t< Plant > Model
linalg::Matrix< T, StateDim, OutputDim > WMat
constexpr auto vertex_constraint(const Plant &plant, const ZVar &Z) const
vertex constraint
plant_state_vec_t< Model > State
linalg::Matrix< T, StateDim, StateDim > QMat
static constexpr std::size_t ZDim
constexpr auto operator()(const Polytope &poly, const Var &Z, T margin=1e-6) const
operator overload (polytopic observer)
linalg::Matrix< T, StateDim, OutputDim > LMat
base type traits for plant model