24#include <janus/core/JanusTypes.hpp>
29#include <unordered_map>
50 using Scalar = janus::SymbolicScalar;
62 : config_(config), backplane_(registry_) {
64 ProvisionComponents();
81 if (x.size() != state_manager_.GetState().size()) {
82 throw std::invalid_argument(
"SymbolicSimulatorCore::SetState: size mismatch");
84 state_manager_.SetState(x);
102 state_manager_.ZeroDerivatives();
108 std::vector<Component<Scalar> *> exec_order;
109 exec_order.reserve(components_.size());
112 std::unordered_map<std::string, int> priority_map;
113 for (
const auto &group : config_.scheduler.groups) {
114 for (
const auto &member : group.members) {
115 priority_map[member.component] = group.priority;
120 for (
auto &comp : components_) {
121 exec_order.push_back(comp.get());
124 exec_order.begin(), exec_order.end(),
126 int pa = priority_map.count(a->FullName()) ? priority_map[a->FullName()]
128 int pb = priority_map.count(b->FullName()) ? priority_map[b->FullName()] : 1000;
133 for (
auto *comp : exec_order) {
134 comp->PreStep(time_, dt);
136 for (
auto *comp : exec_order) {
137 comp->Step(time_, dt);
139 for (
auto *comp : exec_order) {
140 comp->PostStep(time_, dt);
143 return state_manager_.GetDerivatives();
149 [[nodiscard]] std::size_t
GetStateSize()
const {
return state_manager_.TotalSize(); }
154 [[nodiscard]] JanusVector<Scalar>
GetState()
const {
return state_manager_.GetState(); }
160 return state_manager_.GetDerivatives();
171 return registry_.GetByName(name);
177 void SetSignal(
const std::string &name,
Scalar value) { registry_.SetByName(name, value); }
182 [[nodiscard]]
bool HasSignal(
const std::string &name)
const {
183 return registry_.HasSignal(name);
190 return registry_.get_all_signal_names();
197 return state_manager_.GetBindings();
204 for (
const auto &comp : components_) {
205 if (comp->FullName() == name) {
215 [[nodiscard]] std::size_t
NumComponents()
const {
return components_.size(); }
222 void CreateComponents() {
225 for (
const auto &comp_cfg : config_.
components) {
226 if (!factory.HasType(comp_cfg.type)) {
227 throw ConfigError(
"SymbolicSimulatorCore: No symbolic registration for component "
231 "Ensure component uses ICARUS_REGISTER_COMPONENT macro.");
233 auto component = factory.Create(comp_cfg);
234 components_.push_back(std::move(component));
238 void ProvisionComponents() {
239 for (
auto &comp : components_) {
240 backplane_.set_context(comp->Entity(), comp->Name());
241 backplane_.clear_tracking();
242 comp->Provision(backplane_);
244 backplane_.clear_context();
248 void ApplyRouting() {
249 for (
const auto &route : config_.routes) {
250 router_.AddRoute(route);
252 router_.ApplyRoutes(backplane_);
255 void AllocateState() {
257 state_manager_.DiscoverStates(registry_);
260 void StageComponents() {
261 for (
auto &comp : components_) {
262 backplane_.set_context(comp->Entity(), comp->Name());
263 backplane_.clear_tracking();
264 comp->Stage(backplane_);
266 backplane_.clear_context();
274 SimulatorConfig config_;
277 std::vector<std::unique_ptr<Component<Scalar>>> components_;
280 SignalRegistry<Scalar> registry_;
281 Backplane<Scalar> backplane_;
282 signal::SignalRouter<Scalar> router_;
285 StateManager<Scalar> state_manager_;
Component-facing facade for signal registration and resolution.
Configuration container for components with typed accessors.
Factory for creating components from configuration.
Base class for all simulation components.
Core type definitions, concepts, and configuration for Icarus.
Consolidated error handling for Icarus.
Signal Registry (Backplane) for Icarus.
Centralized signal routing configuration.
Simulator and subsystem configuration structs.
Manages state integration via unified signal model.
static ComponentFactory & Instance()
Get singleton instance.
Definition ComponentFactory.hpp:109
Base class for all simulation components.
Definition Component.hpp:47
Configuration/parsing errors with optional file context.
Definition Error.hpp:185
JanusVector< Scalar > ComputeDerivatives()
Compute derivatives symbolically.
Definition SymbolicSimulatorCore.hpp:101
void SetTime(Scalar t)
Set time (symbolic).
Definition SymbolicSimulatorCore.hpp:90
JanusVector< Scalar > GetDerivatives() const
Get derivative vector (after ComputeDerivatives).
Definition SymbolicSimulatorCore.hpp:159
Component< Scalar > * GetComponent(const std::string &name) const
Get component by name.
Definition SymbolicSimulatorCore.hpp:203
bool HasSignal(const std::string &name) const
Check if signal exists.
Definition SymbolicSimulatorCore.hpp:182
const std::vector< StateBinding< Scalar > > & GetStateBindings() const
Get state bindings (for introspection).
Definition SymbolicSimulatorCore.hpp:196
void SetState(const JanusVector< Scalar > &x)
Set state vector (symbolic).
Definition SymbolicSimulatorCore.hpp:80
std::vector< std::string > GetSignalNames() const
Get all registered signal names.
Definition SymbolicSimulatorCore.hpp:189
void SetSignal(const std::string &name, Scalar value)
Write signal value (symbolic).
Definition SymbolicSimulatorCore.hpp:177
Scalar GetSignal(const std::string &name) const
Read signal value (symbolic).
Definition SymbolicSimulatorCore.hpp:170
std::size_t GetStateSize() const
Get total state size.
Definition SymbolicSimulatorCore.hpp:149
janus::SymbolicScalar Scalar
Definition SymbolicSimulatorCore.hpp:50
JanusVector< Scalar > GetState() const
Get current state vector (copy).
Definition SymbolicSimulatorCore.hpp:154
SymbolicSimulatorCore(const SimulatorConfig &config)
Create from simulator config.
Definition SymbolicSimulatorCore.hpp:61
std::size_t NumComponents() const
Get number of components.
Definition SymbolicSimulatorCore.hpp:215
Definition Simulator.hpp:53
Complete simulation configuration.
Definition SimulatorConfig.hpp:673
std::vector< ComponentConfig > components
Definition SimulatorConfig.hpp:696