11#include "akreon/linalg/linalg_util.hpp"
55template <StateSpaceLike SS,
typename InputPorts,
typename OutputPorts>
68 "Input port layout is invalid for the state-space input");
70 "Output port layout is invalid for the state-space output");
118 template <PortRole OutRole, PortRole InRole>
122 linalg::Matrix<T, Rows, Cols>
result{};
133 template <PortRole Role>
134 constexpr auto input_matrix()
const {
136 linalg::Matrix<T, StateDim, Cols>
result{};
142 template <PortRole Role>
143 constexpr auto output_matrix()
const {
145 linalg::Matrix<T, Rows, StateDim>
result{};
153 constexpr void copy_input_ports(
Mat&
result)
const {
156 constexpr std::size_t Offset =
160 linalg::get_block<0, StateDim, Offset, Offset + Size>(
state_space.B);
161 result = linalg::set_block<0, StateDim, DestOffset, DestOffset + Size>(
170 constexpr void copy_output_ports(
Mat&
result)
const {
173 constexpr std::size_t Offset =
177 linalg::get_block<Offset, Offset + Size, 0, StateDim>(
state_space.C);
178 result = linalg::set_block<DestOffset, DestOffset + Size, 0, StateDim>(
187 constexpr void copy_feedthrough_ports(
Mat&
result)
const {
192 constexpr std::size_t
OutSize =
205 constexpr void copy_feedthrough_input_ports(
Mat&
result)
const {
210 constexpr std::size_t
InSize =
227 template <PortRole Role, std::
size_t Index>
228 static consteval std::size_t feedthrough_output_destination() {
229 std::size_t
dest = 0;
230 [&]<std::size_t...
Is>(std::index_sequence<
Is...>)
consteval {
232 }(std::make_index_sequence<OutputPortsT::template count<Role>()>{});
constexpr bool is_continuous_v
check if continuous or not
typename plant_traits< linalg::remove_cvref_t< Plant > >::T plant_type_t
extract scalar type from plant
Forward declaration of PlantModel.
static constexpr std::size_t OutputDim
constexpr auto control_matrix() const
Return B_u (StateDim x ControlDim), for actuator inputs.
constexpr PlantModel(const StateSpace &ss, const InputPortsT &, const OutputPortsT &)
Copy a model with layout arguments supplied for type deduction.
static constexpr std::size_t StateDim
linalg::remove_cvref_t< InputPorts > InputPortsT
constexpr auto feedthrough() const
Extract D blocks from the selected input role to output role.
linalg::remove_cvref_t< OutputPorts > OutputPortsT
constexpr auto measurement_matrix() const
Return C_y (MeasurementDim x StateDim), for measured outputs.
constexpr auto dynamics_matrix() const
Return A (StateDim x StateDim), without changing the time domain.
static constexpr std::size_t InputDim
constexpr auto exogenous_matrix() const
Return B_w (StateDim x ExogenousDim), for disturbance/reference/noise inputs.
SS state_space
Owned full model; accessors reflect its current matrices.
constexpr auto performance_matrix() const
Return C_z (PerformanceDim x StateDim), for regulated outputs.
constexpr PlantModel(const StateSpace &ss)
Copy a state-space model using the template-specified layouts.
linalg::remove_cvref_t< SS > StateSpace
base type traits for plant model