Icarus
Vehicle Simulation as a Transformable Computational Graph, built on Vulcan and Janus
Loading...
Searching...
No Matches
SimulatorConfig.hpp
Go to the documentation of this file.
1#pragma once
2
13
20
21#include <cmath>
22#include <cstdint>
23#include <set>
24#include <string>
25#include <unordered_map>
26#include <unordered_set>
27#include <utility>
28#include <vector>
29
30namespace icarus {
31
32// =============================================================================
33// Forward Declarations
34// =============================================================================
35
36struct EpochConfig;
37struct TrimConfig;
39struct SymbolicsConfig;
40struct StageConfig;
41struct SchedulerConfig;
42struct OutputConfig;
43struct SimulatorConfig;
44
45// =============================================================================
46// EpochConfig
47// =============================================================================
48
61 std::string system = "MET";
62
65 std::string reference;
66
68 double jd = 0.0;
69
71 int gps_week = 0;
72
74 double gps_seconds = 0.0;
75
78 bool gps_configured = false;
79
81 [[nodiscard]] bool IsConfigured() const {
82 return !reference.empty() || jd > 0.0 || gps_configured;
83 }
84
86 [[nodiscard]] static EpochConfig Default() { return EpochConfig{}; }
87};
88
89// =============================================================================
90// TrimConfig
91// =============================================================================
92
112 bool enabled = false;
113
115 std::string mode = "equilibrium";
116
117 // =========================================================================
118 // Equilibrium mode settings
119 // =========================================================================
120
122 std::vector<std::string> zero_derivatives; // e.g., ["velocity_dot", "angular_rate_dot"]
123
125 std::vector<std::string> control_signals; // e.g., ["throttle", "elevator"]
126
128 double tolerance = 1e-6;
129 int max_iterations = 100;
130 std::string method = "newton";
131
133 std::unordered_map<std::string, double> initial_guesses;
134
136 std::unordered_map<std::string, std::pair<double, double>> control_bounds;
137
138 // =========================================================================
139 // Warmstart mode settings
140 // =========================================================================
141
143 std::string recording_path;
144
146 double resume_time = 0.0;
147
149 bool validate_schema = true;
150
151 // =========================================================================
152 // Methods
153 // =========================================================================
154
156 [[nodiscard]] static TrimConfig Default() { return TrimConfig{}; }
157
159 [[nodiscard]] bool IsWarmstart() const { return mode == "warmstart"; }
160
162 [[nodiscard]] bool IsEquilibrium() const { return mode == "equilibrium"; }
163
165 [[nodiscard]] std::vector<std::string> Validate() const {
166 std::vector<std::string> errors;
167 if (enabled) {
168 if (mode == "equilibrium") {
169 if (zero_derivatives.empty()) {
170 errors.push_back("Trim enabled but no zero_derivatives specified");
171 }
172 if (control_signals.empty()) {
173 errors.push_back("Trim enabled but no control_signals specified");
174 }
175 if (method != "newton" && method != "ipopt") {
176 errors.push_back("Unknown trim method: " + method);
177 }
178 } else if (mode == "warmstart") {
179 if (recording_path.empty()) {
180 errors.push_back("Warmstart enabled but no recording_path specified");
181 }
182 } else {
183 errors.push_back("Unknown trim mode: " + mode +
184 " (expected 'equilibrium' or 'warmstart')");
185 }
186 }
187 return errors;
188 }
189};
190
191// =============================================================================
192// LinearizationConfig
193// =============================================================================
194
201 bool enabled = false;
202
204 std::vector<std::string> states;
205
207 std::vector<std::string> inputs;
208
210 std::vector<std::string> outputs;
211
212 // Export options
213 bool export_matlab = false;
214 bool export_numpy = false;
215 bool export_json = false;
216 std::string output_dir;
217
219 [[nodiscard]] static LinearizationConfig Default() { return LinearizationConfig{}; }
220
222 [[nodiscard]] std::vector<std::string> Validate() const {
223 std::vector<std::string> errors;
224 if (enabled && states.empty()) {
225 errors.push_back("Linearization enabled but no states specified");
226 }
227 return errors;
228 }
229};
230
231// =============================================================================
232// SymbolicsConfig
233// =============================================================================
234
241 bool enabled = false;
242 bool generate_dynamics = true;
243 bool generate_jacobian = false;
244 std::string output_dir;
245
247 [[nodiscard]] static SymbolicsConfig Default() { return SymbolicsConfig{}; }
248};
249
250// =============================================================================
251// StageConfig
252// =============================================================================
253
265
266 // Validation settings
267 bool validate_wiring = false;
268 bool warn_on_unwired = true;
269
271 [[nodiscard]] static StageConfig Default() { return StageConfig{}; }
272
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());
278 auto lin_errors = linearization.Validate();
279 errors.insert(errors.end(), lin_errors.begin(), lin_errors.end());
280 return errors;
281 }
282};
283
284// =============================================================================
285// SchedulerConfig
286// =============================================================================
287
295
300 std::string component;
301 int priority = 0;
302
303 GroupMember() = default;
304 GroupMember(std::string comp, int prio = 0) : component(std::move(comp)), priority(prio) {}
305};
306
311 std::string name;
312 double rate_hz = 400.0;
313 int priority = 0;
314 std::vector<GroupMember> members;
315
317 std::set<int32_t> active_phases;
318
320 SchedulerGroupConfig(std::string n, double rate, int prio = 0)
321 : name(std::move(n)), rate_hz(rate), priority(prio) {}
322
324 [[nodiscard]] bool IsActiveInPhase(int32_t current_phase) const {
325 return active_phases.empty() || active_phases.contains(current_phase);
326 }
327};
328
339
347 std::vector<SchedulerGroupConfig> groups;
349
351 std::unordered_map<std::string, int> group_frame_divisors;
352
354 [[nodiscard]] static SchedulerConfig Default() {
355 SchedulerConfig cfg;
356 cfg.groups.emplace_back("default", 400.0, 0);
357 return cfg;
358 }
359
362 [[nodiscard]] static SchedulerConfig FromFile(const std::string & /*yaml_path*/) {
363 throw NotImplementedError("SchedulerConfig::FromFile - use SimulationLoader::Load()");
364 }
365
367 [[nodiscard]] double MaxRate() const {
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;
372 }
373 }
374 return max_rate > 0.0 ? max_rate : 400.0; // Default fallback
375 }
376
378 [[nodiscard]] std::vector<std::string> Validate() const {
379 std::vector<std::string> errors;
380
381 if (groups.empty()) {
382 errors.push_back("No scheduler groups defined");
383 }
384
385 std::unordered_set<std::string> seen_components;
386 std::unordered_set<std::string> seen_group_names;
387
388 for (const auto &group : groups) {
389 // Check for duplicate group names
390 if (seen_group_names.count(group.name)) {
391 errors.push_back("Duplicate group name: " + group.name);
392 }
393 seen_group_names.insert(group.name);
394
395 // Check rate is positive
396 if (group.rate_hz <= 0.0) {
397 errors.push_back("Group '" + group.name +
398 "' has invalid rate: " + std::to_string(group.rate_hz));
399 }
400
401 // Check for duplicate component assignments
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");
406 }
407 seen_components.insert(member.component);
408 }
409 }
410
411 return errors;
412 }
413
415 [[nodiscard]] std::vector<std::string> ValidateGlobalTiming(double sim_rate_hz) const {
416 std::vector<std::string> errors;
417
418 for (const auto &group : groups) {
419 // Group rate cannot exceed simulation rate
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");
424 }
425
426 // Group rate must be integer divisor of simulation rate
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");
433 }
434 }
435
436 return errors;
437 }
438
440 void ComputeFrameDivisors(double sim_rate_hz) {
441 group_frame_divisors.clear();
442 for (const auto &group : groups) {
443 int divisor = static_cast<int>(std::round(sim_rate_hz / group.rate_hz));
444 group_frame_divisors[group.name] = divisor;
445 }
446 }
447};
448
449// =============================================================================
450// OutputConfig
451// =============================================================================
452
457 std::string directory = "./output";
458
459 // Data dictionary
460 bool data_dictionary = true;
461 std::string data_dictionary_format = "yaml";
462
463 // Telemetry
464 bool telemetry = true;
465 std::string telemetry_format = "hdf5";
466
467 // Timing reports
468 bool timing_report = false;
469
471 [[nodiscard]] static OutputConfig Default() { return OutputConfig{}; }
472};
473
474// =============================================================================
475// RecordingConfig
476// =============================================================================
477
505 bool enabled = false;
506
508 std::string path = "output/recording.h5";
509
511 std::string mode = "outputs";
512
514 std::vector<std::string> include;
515
517 std::vector<std::string> exclude;
518
521
523 bool include_inputs = false;
524
527
529 int decimation = 1;
530
532 bool export_csv = false;
533
535 [[nodiscard]] static RecordingConfig Default() { return RecordingConfig{}; }
536
538 [[nodiscard]] bool IsActive() const { return enabled && mode != "off"; }
539
541 [[nodiscard]] std::vector<std::string> Validate() const {
542 std::vector<std::string> errors;
543 if (enabled) {
544 if (decimation < 1) {
545 errors.push_back("Recording decimation must be >= 1");
546 }
547 if (mode != "off" && mode != "all" && mode != "outputs" && mode != "signals") {
548 errors.push_back("Unknown recording mode: " + mode);
549 }
550 if (mode == "signals" && include.empty()) {
551 errors.push_back("Recording mode 'signals' requires include patterns");
552 }
553 }
554 return errors;
555 }
556};
557
558// =============================================================================
559// EntityTemplate
560// =============================================================================
561
569 std::string name;
570 std::string description;
571
573 std::vector<ComponentConfig> components;
574
576 std::vector<signal::SignalRoute> routes;
577
580
583
585 static EntityTemplate FromFile(const std::string &yaml_path);
586};
587
588// =============================================================================
589// EntityInstance
590// =============================================================================
591
600
602 std::string name;
603
605 std::unordered_map<std::string, ComponentConfig> overrides;
606};
607
608// =============================================================================
609// SwarmConfig
610// =============================================================================
611
621
623 std::string name_prefix;
624
626 int count = 1;
627
628 // Future: per-instance overrides with Jinja-style templating
629 // Future: swarm-internal routes (neighbor connections)
630};
631
632// =============================================================================
633// EntitySystemConfig
634// =============================================================================
635
643 std::vector<EntityInstance> entities;
644 std::vector<SwarmConfig> swarms;
645 std::vector<signal::SignalRoute> cross_entity_routes;
646
648 std::vector<std::string> entity_order;
649 bool auto_order = true;
650
657 std::tuple<std::vector<ComponentConfig>, std::vector<signal::SignalRoute>, SchedulerConfig>
658 ExpandAll() const;
659};
660
661// =============================================================================
662// SimulatorConfig
663// =============================================================================
664
674 // =========================================================================
675 // Identity
676 // =========================================================================
677 std::string name = "Simulation";
678 std::string version = icarus::Version();
679 std::string description;
680 std::string source_file;
681
682 // =========================================================================
683 // Time
684 // =========================================================================
685 double t_start = 0.0;
686 double t_end = 100.0;
687 double dt = 0.01;
688
692
693 // =========================================================================
694 // Components (flattened from entity expansion)
695 // =========================================================================
696 std::vector<ComponentConfig> components;
697
698 // =========================================================================
699 // Signal Routing (flattened from entity expansion)
700 // =========================================================================
701 std::vector<signal::SignalRoute> routes;
702
703 // =========================================================================
704 // Scheduler
705 // =========================================================================
707
708 // =========================================================================
709 // Staging (Trim + Linearization + Symbolics)
710 // =========================================================================
712
713 // =========================================================================
714 // Phase Management
715 // =========================================================================
717
718 // =========================================================================
719 // Integrator
720 // =========================================================================
722
723 // =========================================================================
724 // Logging
725 // =========================================================================
727
728 // =========================================================================
729 // Recording (HDF5 telemetry)
730 // =========================================================================
732
733 // =========================================================================
734 // Output
735 // =========================================================================
737
738 // =========================================================================
739 // Factory Methods
740 // =========================================================================
741
743 [[nodiscard]] static SimulatorConfig Default() { return SimulatorConfig{}; }
744
747 [[nodiscard]] static SimulatorConfig FromFile(const std::string &path);
748
751 [[nodiscard]] static SimulatorConfig FromFiles(const std::string & /*master_path*/,
752 const std::string & /*routes_path*/) {
753 throw NotImplementedError("SimulatorConfig::FromFiles - use SimulationLoader::Load()");
754 }
755
757 [[nodiscard]] std::vector<std::string> Validate() const {
758 std::vector<std::string> errors;
759
760 // Time validation
761 if (t_end <= t_start) {
762 errors.push_back("t_end must be greater than t_start");
763 }
764 if (dt <= 0.0) {
765 errors.push_back("dt must be positive");
766 }
767
768 // Sub-config validation
769 auto sched_errors = scheduler.Validate();
770 errors.insert(errors.end(), sched_errors.begin(), sched_errors.end());
771
772 auto stage_errors = staging.Validate();
773 errors.insert(errors.end(), stage_errors.begin(), stage_errors.end());
774
775 return errors;
776 }
777};
778
779} // namespace icarus
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
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