25#include <unordered_map>
26#include <unordered_set>
115 std::string
mode =
"equilibrium";
165 [[nodiscard]] std::vector<std::string>
Validate()
const {
166 std::vector<std::string> errors;
168 if (
mode ==
"equilibrium") {
170 errors.push_back(
"Trim enabled but no zero_derivatives specified");
173 errors.push_back(
"Trim enabled but no control_signals specified");
176 errors.push_back(
"Unknown trim method: " +
method);
178 }
else if (
mode ==
"warmstart") {
180 errors.push_back(
"Warmstart enabled but no recording_path specified");
183 errors.push_back(
"Unknown trim mode: " +
mode +
184 " (expected 'equilibrium' or 'warmstart')");
222 [[nodiscard]] std::vector<std::string>
Validate()
const {
223 std::vector<std::string> errors;
225 errors.push_back(
"Linearization enabled but no states specified");
274 [[nodiscard]] std::vector<std::string>
Validate()
const {
275 std::vector<std::string> errors;
276 auto trim_errors =
trim.Validate();
277 errors.insert(errors.end(), trim_errors.begin(), trim_errors.end());
279 errors.insert(errors.end(), lin_errors.begin(), lin_errors.end());
347 std::vector<SchedulerGroupConfig>
groups;
356 cfg.
groups.emplace_back(
"default", 400.0, 0);
368 double max_rate = 0.0;
369 for (
const auto &group :
groups) {
370 if (group.rate_hz > max_rate) {
371 max_rate = group.rate_hz;
374 return max_rate > 0.0 ? max_rate : 400.0;
378 [[nodiscard]] std::vector<std::string>
Validate()
const {
379 std::vector<std::string> errors;
382 errors.push_back(
"No scheduler groups defined");
385 std::unordered_set<std::string> seen_components;
386 std::unordered_set<std::string> seen_group_names;
388 for (
const auto &group :
groups) {
390 if (seen_group_names.count(group.name)) {
391 errors.push_back(
"Duplicate group name: " + group.name);
393 seen_group_names.insert(group.name);
396 if (group.rate_hz <= 0.0) {
397 errors.push_back(
"Group '" + group.name +
398 "' has invalid rate: " + std::to_string(group.rate_hz));
402 for (
const auto &member : group.members) {
403 if (seen_components.count(member.component)) {
404 errors.push_back(
"Component '" + member.component +
405 "' assigned to multiple groups");
407 seen_components.insert(member.component);
416 std::vector<std::string> errors;
418 for (
const auto &group :
groups) {
420 if (group.rate_hz > sim_rate_hz) {
421 errors.push_back(
"Group '" + group.name +
"' rate " +
422 std::to_string(group.rate_hz) +
" Hz exceeds simulation rate " +
423 std::to_string(sim_rate_hz) +
" Hz");
427 double ratio = sim_rate_hz / group.rate_hz;
428 if (std::abs(ratio - std::round(ratio)) > 1e-9) {
429 errors.push_back(
"Group '" + group.name +
"' rate " +
430 std::to_string(group.rate_hz) +
431 " Hz is not an integer divisor of simulation rate " +
432 std::to_string(sim_rate_hz) +
" Hz");
442 for (
const auto &group :
groups) {
443 int divisor =
static_cast<int>(std::round(sim_rate_hz / group.rate_hz));
508 std::string
path =
"output/recording.h5";
541 [[nodiscard]] std::vector<std::string>
Validate()
const {
542 std::vector<std::string> errors;
545 errors.push_back(
"Recording decimation must be >= 1");
547 if (
mode !=
"off" &&
mode !=
"all" &&
mode !=
"outputs" &&
mode !=
"signals") {
548 errors.push_back(
"Unknown recording mode: " +
mode);
551 errors.push_back(
"Recording mode 'signals' requires include patterns");
605 std::unordered_map<std::string, ComponentConfig>
overrides;
657 std::tuple<std::vector<ComponentConfig>, std::vector<signal::SignalRoute>,
SchedulerConfig>
677 std::string
name =
"Simulation";
752 const std::string & ) {
757 [[nodiscard]] std::vector<std::string>
Validate()
const {
758 std::vector<std::string> errors;
762 errors.push_back(
"t_end must be greater than t_start");
765 errors.push_back(
"dt must be positive");
769 auto sched_errors =
scheduler.Validate();
770 errors.insert(errors.end(), sched_errors.begin(), sched_errors.end());
772 auto stage_errors =
staging.Validate();
773 errors.insert(errors.end(), stage_errors.begin(), stage_errors.end());
Configuration container for components with typed accessors.
Core type definitions, concepts, and configuration for Icarus.
Integrator type enumeration and configuration.
Unified logging service for Icarus.
Flight phase transition management.
Centralized signal routing configuration.
Base class for all Icarus exceptions.
Definition Error.hpp:52
Stub for unimplemented features.
Definition Error.hpp:399
Definition AggregationTypes.hpp:13
SchedulingMode
Scheduling mode enumeration.
Definition SimulatorConfig.hpp:291
@ Automatic
Topological sort from signal dependencies (Future TODO).
Definition SimulatorConfig.hpp:292
@ Explicit
User-defined execution order.
Definition SimulatorConfig.hpp:293
constexpr const char * Version()
Version string (derived from components).
Definition CoreTypes.hpp:152
Entity instance (template + name + overrides).
Definition SimulatorConfig.hpp:597
std::unordered_map< std::string, ComponentConfig > overrides
Component name -> config overrides.
Definition SimulatorConfig.hpp:605
EntityTemplate entity_template
Template (either inline or loaded from file via !include).
Definition SimulatorConfig.hpp:599
std::string name
Instance name (becomes entity prefix in signals).
Definition SimulatorConfig.hpp:602
Entity system configuration.
Definition SimulatorConfig.hpp:642
std::vector< signal::SignalRoute > cross_entity_routes
Definition SimulatorConfig.hpp:645
std::vector< EntityInstance > entities
Definition SimulatorConfig.hpp:643
bool auto_order
Definition SimulatorConfig.hpp:649
std::vector< std::string > entity_order
Entity execution order (empty = auto-order based on dependencies).
Definition SimulatorConfig.hpp:648
std::tuple< std::vector< ComponentConfig >, std::vector< signal::SignalRoute >, SchedulerConfig > ExpandAll() const
Expand all entities and swarms to flat component list.
Definition SimulationLoader.hpp:828
std::vector< SwarmConfig > swarms
Definition SimulatorConfig.hpp:644
Entity template loaded from YAML.
Definition SimulatorConfig.hpp:568
std::vector< signal::SignalRoute > routes
Internal routes (relative names, expanded with entity prefix).
Definition SimulatorConfig.hpp:576
std::string description
Optional description.
Definition SimulatorConfig.hpp:570
std::string name
Template name (e.g., "Rocket").
Definition SimulatorConfig.hpp:569
static EntityTemplate FromFile(const std::string &yaml_path)
Load template from YAML file (implemented in SimulationLoader.hpp).
Definition SimulationLoader.hpp:822
StageConfig staging
Internal staging configuration.
Definition SimulatorConfig.hpp:582
SchedulerConfig scheduler
Internal scheduler configuration.
Definition SimulatorConfig.hpp:579
std::vector< ComponentConfig > components
Components within this entity.
Definition SimulatorConfig.hpp:573
Time epoch configuration for absolute time support.
Definition SimulatorConfig.hpp:59
static EpochConfig Default()
Create default MET-only config.
Definition SimulatorConfig.hpp:86
int gps_week
GPS week number (for GPS system).
Definition SimulatorConfig.hpp:71
bool gps_configured
Definition SimulatorConfig.hpp:78
std::string reference
Definition SimulatorConfig.hpp:65
double jd
Julian Date (for TAI/TT systems when reference is empty).
Definition SimulatorConfig.hpp:68
double gps_seconds
GPS seconds of week (for GPS system).
Definition SimulatorConfig.hpp:74
std::string system
Time system: "MET" (default), "UTC", "TAI", "GPS".
Definition SimulatorConfig.hpp:61
bool IsConfigured() const
Check if epoch is configured (non-MET-only mode).
Definition SimulatorConfig.hpp:81
std::string component
Component name.
Definition SimulatorConfig.hpp:300
int priority
Execution order within group (lower = runs first).
Definition SimulatorConfig.hpp:301
GroupMember(std::string comp, int prio=0)
Definition SimulatorConfig.hpp:304
Configuration for integrator creation.
Definition IntegratorTypes.hpp:83
static IntegratorConfig RK4Default()
Create default RK4 config.
Definition IntegratorTypes.hpp:96
Linearization configuration.
Definition SimulatorConfig.hpp:200
bool export_matlab
Definition SimulatorConfig.hpp:213
std::vector< std::string > states
State variables (for A matrix rows/cols).
Definition SimulatorConfig.hpp:204
std::vector< std::string > inputs
Input variables (for B matrix cols).
Definition SimulatorConfig.hpp:207
static LinearizationConfig Default()
Create default disabled config.
Definition SimulatorConfig.hpp:219
bool enabled
Definition SimulatorConfig.hpp:201
std::string output_dir
Definition SimulatorConfig.hpp:216
bool export_numpy
Definition SimulatorConfig.hpp:214
std::vector< std::string > Validate() const
Validate configuration.
Definition SimulatorConfig.hpp:222
bool export_json
Definition SimulatorConfig.hpp:215
std::vector< std::string > outputs
Output variables (for C matrix rows).
Definition SimulatorConfig.hpp:210
Logging configuration.
Definition LogService.hpp:35
Output/export configuration.
Definition SimulatorConfig.hpp:456
bool data_dictionary
Definition SimulatorConfig.hpp:460
std::string data_dictionary_format
"yaml", "json", "csv"
Definition SimulatorConfig.hpp:461
std::string directory
Definition SimulatorConfig.hpp:457
bool telemetry
Definition SimulatorConfig.hpp:464
bool timing_report
Definition SimulatorConfig.hpp:468
static OutputConfig Default()
Create default config.
Definition SimulatorConfig.hpp:471
std::string telemetry_format
"hdf5", "csv", "binary"
Definition SimulatorConfig.hpp:465
Configuration for phase management.
Definition PhaseManager.hpp:40
HDF5 recording configuration.
Definition SimulatorConfig.hpp:503
std::vector< std::string > exclude
Exclude patterns (regex) - applied after include.
Definition SimulatorConfig.hpp:517
int flush_interval
Flush interval (frames between disk flushes, 0 = auto).
Definition SimulatorConfig.hpp:526
bool include_derivatives
Include derivative signals (_dot).
Definition SimulatorConfig.hpp:520
bool IsActive() const
Check if recording is active.
Definition SimulatorConfig.hpp:538
bool enabled
Enable recording.
Definition SimulatorConfig.hpp:505
std::vector< std::string > include
Include patterns (regex) - used when mode = "signals".
Definition SimulatorConfig.hpp:514
std::string mode
Recording mode: "off", "all", "outputs", "signals".
Definition SimulatorConfig.hpp:511
int decimation
Decimation factor: record every N frames (1 = every frame, 10 = every 10th frame).
Definition SimulatorConfig.hpp:529
std::vector< std::string > Validate() const
Validate recording configuration.
Definition SimulatorConfig.hpp:541
std::string path
Output file path.
Definition SimulatorConfig.hpp:508
bool include_inputs
Include input signals (only meaningful with mode = "all").
Definition SimulatorConfig.hpp:523
static RecordingConfig Default()
Create default config (recording disabled).
Definition SimulatorConfig.hpp:535
bool export_csv
Export CSV copy on close (for PlotJuggler, Excel, etc.).
Definition SimulatorConfig.hpp:532
Scheduler configuration with rate groups.
Definition SimulatorConfig.hpp:346
std::unordered_map< std::string, int > group_frame_divisors
Computed at runtime: frame divisor for each group.
Definition SimulatorConfig.hpp:351
static SchedulerConfig FromFile(const std::string &)
Definition SimulatorConfig.hpp:362
std::vector< std::string > ValidateGlobalTiming(double sim_rate_hz) const
Validate rates against global simulation rate (called after rate derivation).
Definition SimulatorConfig.hpp:415
TopologyConfig topology
Definition SimulatorConfig.hpp:348
std::vector< std::string > Validate() const
Validate configuration (local validation, before global rate is known).
Definition SimulatorConfig.hpp:378
void ComputeFrameDivisors(double sim_rate_hz)
Compute frame divisors for all groups given simulation rate.
Definition SimulatorConfig.hpp:440
std::vector< SchedulerGroupConfig > groups
Definition SimulatorConfig.hpp:347
double MaxRate() const
Get maximum rate across all groups.
Definition SimulatorConfig.hpp:367
static SchedulerConfig Default()
Create default config with a single 400Hz group.
Definition SimulatorConfig.hpp:354
SchedulerGroupConfig()=default
std::set< int32_t > active_phases
Phase gating: if non-empty, group only executes when current phase is in this set.
Definition SimulatorConfig.hpp:317
SchedulerGroupConfig(std::string n, double rate, int prio=0)
Definition SimulatorConfig.hpp:320
std::vector< GroupMember > members
Definition SimulatorConfig.hpp:314
bool IsActiveInPhase(int32_t current_phase) const
Check if group should execute in given phase (empty = all phases).
Definition SimulatorConfig.hpp:324
std::string name
Definition SimulatorConfig.hpp:311
double rate_hz
Must be integer divisor of simulation rate.
Definition SimulatorConfig.hpp:312
int priority
Execution order relative to other groups.
Definition SimulatorConfig.hpp:313
Complete simulation configuration.
Definition SimulatorConfig.hpp:673
double t_end
Definition SimulatorConfig.hpp:686
std::string version
Definition SimulatorConfig.hpp:678
EpochConfig epoch
Definition SimulatorConfig.hpp:691
OutputConfig output
Definition SimulatorConfig.hpp:736
static SimulatorConfig FromFiles(const std::string &, const std::string &)
Definition SimulatorConfig.hpp:751
std::string name
Definition SimulatorConfig.hpp:677
SchedulerConfig scheduler
Definition SimulatorConfig.hpp:706
double t_start
Definition SimulatorConfig.hpp:685
StageConfig staging
Definition SimulatorConfig.hpp:711
RecordingConfig recording
Definition SimulatorConfig.hpp:731
static SimulatorConfig Default()
Create default config.
Definition SimulatorConfig.hpp:743
std::vector< signal::SignalRoute > routes
Definition SimulatorConfig.hpp:701
double dt
Note: may be auto-derived from scheduler.
Definition SimulatorConfig.hpp:687
LogConfig logging
Definition SimulatorConfig.hpp:726
PhaseConfig phases
Definition SimulatorConfig.hpp:716
std::vector< std::string > Validate() const
Validate configuration consistency.
Definition SimulatorConfig.hpp:757
std::string description
Definition SimulatorConfig.hpp:679
std::string source_file
Path to source YAML file (set by loader).
Definition SimulatorConfig.hpp:680
static SimulatorConfig FromFile(const std::string &path)
Definition SimulationLoader.hpp:818
std::vector< ComponentConfig > components
Definition SimulatorConfig.hpp:696
IntegratorConfig< double > integrator
Definition SimulatorConfig.hpp:721
Staging configuration.
Definition SimulatorConfig.hpp:261
bool validate_wiring
Throw if unwired inputs exist (default: warn only).
Definition SimulatorConfig.hpp:267
static StageConfig Default()
Create default config.
Definition SimulatorConfig.hpp:271
bool warn_on_unwired
Log warning for unwired inputs.
Definition SimulatorConfig.hpp:268
TrimConfig trim
Definition SimulatorConfig.hpp:262
SymbolicsConfig symbolics
Definition SimulatorConfig.hpp:264
std::vector< std::string > Validate() const
Validate all sub-configs.
Definition SimulatorConfig.hpp:274
LinearizationConfig linearization
Definition SimulatorConfig.hpp:263
Swarm configuration for bulk entity spawning.
Definition SimulatorConfig.hpp:618
std::string name_prefix
Name prefix (instances will be prefix_000, prefix_001, etc.).
Definition SimulatorConfig.hpp:623
EntityTemplate entity_template
Entity template (inline or loaded from file).
Definition SimulatorConfig.hpp:620
int count
Number of instances to create.
Definition SimulatorConfig.hpp:626
Symbolic generation configuration.
Definition SimulatorConfig.hpp:240
std::string output_dir
Where to export symbolic functions.
Definition SimulatorConfig.hpp:244
bool enabled
Definition SimulatorConfig.hpp:241
bool generate_dynamics
Generate f(x, u) symbolic graph.
Definition SimulatorConfig.hpp:242
static SymbolicsConfig Default()
Create default disabled config.
Definition SimulatorConfig.hpp:247
bool generate_jacobian
Generate df/dx, df/du.
Definition SimulatorConfig.hpp:243
Cycle detection and handling configuration.
Definition SimulatorConfig.hpp:332
bool log_order
Log execution order during Stage().
Definition SimulatorConfig.hpp:337
SchedulingMode mode
Definition SimulatorConfig.hpp:333
CycleHandling cycle_detection
Definition SimulatorConfig.hpp:336
CycleHandling
Definition SimulatorConfig.hpp:335
@ BreakAtDelay
Definition SimulatorConfig.hpp:335
@ Warn
Definition SimulatorConfig.hpp:335
@ Error
Definition SimulatorConfig.hpp:335
Trim configuration for state initialization.
Definition SimulatorConfig.hpp:111
std::unordered_map< std::string, std::pair< double, double > > control_bounds
Control bounds (optional): key -> (min, max).
Definition SimulatorConfig.hpp:136
std::vector< std::string > zero_derivatives
Trim targets: which derivatives should be zero?
Definition SimulatorConfig.hpp:122
std::string mode
Mode: "equilibrium" (solve for steady-state) or "warmstart" (load from recording).
Definition SimulatorConfig.hpp:115
std::string method
"newton" or "ipopt"
Definition SimulatorConfig.hpp:130
int max_iterations
Definition SimulatorConfig.hpp:129
double resume_time
MET to resume from (for warmstart mode).
Definition SimulatorConfig.hpp:146
double tolerance
Optimization settings.
Definition SimulatorConfig.hpp:128
bool enabled
Whether to run trim/initialization.
Definition SimulatorConfig.hpp:112
static TrimConfig Default()
Create default disabled config.
Definition SimulatorConfig.hpp:156
bool validate_schema
Validate recording schema before loading (for warmstart mode).
Definition SimulatorConfig.hpp:149
std::string recording_path
Path to recording file (for warmstart mode).
Definition SimulatorConfig.hpp:143
std::unordered_map< std::string, double > initial_guesses
Initial guesses for controls (optional).
Definition SimulatorConfig.hpp:133
std::vector< std::string > Validate() const
Validate configuration.
Definition SimulatorConfig.hpp:165
bool IsEquilibrium() const
Check if this is equilibrium mode.
Definition SimulatorConfig.hpp:162
bool IsWarmstart() const
Check if this is warmstart mode.
Definition SimulatorConfig.hpp:159
std::vector< std::string > control_signals
Trim controls: which signals can be adjusted?
Definition SimulatorConfig.hpp:125