Icarus
Vehicle Simulation as a Transformable Computational Graph, built on Vulcan and Janus
Loading...
Searching...
No Matches
icarus::SignalRegistry< Scalar > Class Template Reference

Central registry for all simulation signals. More...

#include <Registry.hpp>

Public Types

using SignalIndex = std::size_t

Public Member Functions

void set_current_component (const std::string &name)
 Set the current component context for registration.
void clear_current_component ()
 Clear the current component context.
const std::string & current_component () const
 Get the current component name.
template<typename T>
void register_output (const std::string &name, T *data_ptr, const std::string &unit="", const std::string &description="")
 Register an output signal with pointer binding.
template<typename S>
void register_output_vec3 (const std::string &name, Vec3< S > *data_ptr, const std::string &unit="", const std::string &description="")
 Register a Vec3 output signal as three scalar components.
template<typename S>
void register_output_quat (const std::string &name, Vec4< S > *data_ptr, const std::string &unit="", const std::string &description="")
 Register a Vec4/Quaternion output signal as four scalar components.
template<typename T>
void register_state (const std::string &name, T *value, T *derivative, const std::string &unit="", const std::string &description="")
 Register a scalar state with its derivative.
template<typename S>
void register_state_vec3 (const std::string &name, Vec3< S > *value, Vec3< S > *derivative, const std::string &unit="", const std::string &description="")
 Register a Vec3 state with its derivative.
template<typename S>
void register_state_quat (const std::string &name, Vec4< S > *value, Vec4< S > *derivative, const std::string &unit="", const std::string &description="")
 Register a quaternion state with its derivative.
const auto & get_state_pairs () const
 Get all integrable state pairs.
std::vector< const SignalDescriptor * > get_integrable_signals () const
 Get all integrable signal descriptors.
template<typename T>
SignalHandle< T > resolve (const std::string &name)
 Resolve a signal by name and return a type-safe handle.
template<typename T>
SignalHandle< const T > resolve_const (const std::string &name) const
 Resolve a signal as const (for read-only access).
template<typename S>
Vec3Handle< S > resolve_vec3 (const std::string &name)
 Resolve a Vec3 signal as a Vec3Handle.
template<typename S>
QuatHandle< S > resolve_quat (const std::string &name)
 Resolve a quaternion signal as a QuatHandle.
SignalIndex RegisterSignal (const SignalDescriptor &descriptor)
 Register a new signal output (legacy API).
SignalIndex Resolve (const std::string &name) const
 Resolve a signal by name (legacy API).
bool HasSignal (const std::string &name) const
 Check if a signal exists.
const Scalar & Get (SignalIndex index) const
 Get signal value by index (hot path, legacy).
void Set (SignalIndex index, const Scalar &value)
 Set signal value by index (hot path, legacy).
const Scalar & GetByName (const std::string &name) const
 Get signal value by name (slow path, for debugging).
void SetByName (const std::string &name, const Scalar &value)
 Set signal value by name (slow path, for initialization).
const std::deque< SignalDescriptor > & GetDescriptors () const
 Get all signal descriptors.
std::size_t Size () const
 Get number of registered signals.
std::vector< const SignalDescriptor * > query (const std::string &pattern) const
 Query signals matching a pattern.
const SignalDescriptorget_descriptor (const std::string &name) const
 Get descriptor by name.
template<typename T>
void register_input (const std::string &name, InputHandle< T > *handle, const std::string &units="", const std::string &description="")
 Register an input port.
void register_param (const std::string &name, Scalar *storage, Scalar initial_value, const std::string &units="", const std::string &description="")
 Register a parameter.
void register_config (const std::string &name, int *storage, int initial_value, const std::string &description="")
 Register an int config value.
void register_config (const std::string &name, bool *storage, bool initial_value, const std::string &description="")
 Register a bool config value.
template<typename T>
void wire_input (const std::string &input_name, const std::string &source_name)
 Wire an input to a source signal.
std::vector< std::string > get_unwired_inputs () const
 Get list of unwired input names.
void validate_wiring () const
 Validate all inputs are wired.
std::vector< SignalDescriptorget_outputs () const
 Get all output signal descriptors.
std::vector< SignalDescriptorget_outputs_for_component (const std::string &component_name) const
 Get output signals for a specific component.
std::vector< SignalDescriptorget_inputs_for_component (const std::string &component_name) const
 Get inputs for a specific component.
std::vector< SignalDescriptorget_params_for_component (const std::string &component_name) const
 Get parameters for a specific component.
std::vector< SignalDescriptorget_config_for_component (const std::string &component_name) const
 Get config for a specific component.
std::vector< SignalDescriptorget_inputs () const
 Get all input info.
std::vector< SignalDescriptorget_params () const
 Get all parameter info.
std::vector< SignalDescriptorget_config () const
 Get all config info.
bool has_input (const std::string &name) const
 Check if an input exists.
bool has_param (const std::string &name) const
 Check if a parameter exists.
bool has_config (const std::string &name) const
 Check if a config exists.
std::vector< std::string > get_all_signal_names () const
 Get all output signal names.
std::vector< std::string > get_all_input_names () const
 Get all input signal names.
std::vector< std::string > get_all_output_names () const
 Get all output signal names.
bool HasOutput (const std::string &name) const
 Check if an output signal exists (PascalCase alias).
bool HasInput (const std::string &name) const
 Check if an input port exists (PascalCase alias).
std::vector< std::string > GetAllInputPaths () const
 Get all declared input paths (for SignalRouter validation).
std::vector< std::string > GetAllOutputPaths () const
 Get all declared output paths (for SignalRouter validation).
template<typename T>
void wire_input_with_gain (const std::string &input_name, const std::string &source_name, double gain=1.0)
 Wire an input to a source signal with gain factor.
void wire_input_with_gain (const std::string &input_name, const std::string &source_name, double gain=1.0)
 Wire an input with gain (type-erased version).

Static Public Attributes

static constexpr SignalIndex InvalidIndex = static_cast<SignalIndex>(-1)

Detailed Description

template<typename Scalar>
class icarus::SignalRegistry< Scalar >

Central registry for all simulation signals.

The SignalRegistry manages the signal backplane, providing:

  • Signal registration during Provision (with pointer binding)
  • Type-safe signal resolution during Stage (returning SignalHandle)
  • Fast indexed access during Step (hot path)
  • Vec3/Mat3 expansion for vector signals
  • Owner tracking for collision detection
Template Parameters
ScalarThe numeric type (double or casadi::MX)

Member Typedef Documentation

◆ SignalIndex

template<typename Scalar>
using icarus::SignalRegistry< Scalar >::SignalIndex = std::size_t

Member Function Documentation

◆ clear_current_component()

template<typename Scalar>
void icarus::SignalRegistry< Scalar >::clear_current_component ( )
inline

Clear the current component context.

◆ current_component()

template<typename Scalar>
const std::string & icarus::SignalRegistry< Scalar >::current_component ( ) const
inlinenodiscard

Get the current component name.

◆ Get()

template<typename Scalar>
const Scalar & icarus::SignalRegistry< Scalar >::Get ( SignalIndex index) const
inlinenodiscard

Get signal value by index (hot path, legacy).

Deprecated
Use SignalHandle<T> for direct pointer access

◆ get_all_input_names()

template<typename Scalar>
std::vector< std::string > icarus::SignalRegistry< Scalar >::get_all_input_names ( ) const
inlinenodiscard

Get all input signal names.

◆ get_all_output_names()

template<typename Scalar>
std::vector< std::string > icarus::SignalRegistry< Scalar >::get_all_output_names ( ) const
inlinenodiscard

Get all output signal names.

◆ get_all_signal_names()

template<typename Scalar>
std::vector< std::string > icarus::SignalRegistry< Scalar >::get_all_signal_names ( ) const
inlinenodiscard

Get all output signal names.

Returns only signal names where kind != SignalKind::Input.

◆ get_config()

template<typename Scalar>
std::vector< SignalDescriptor > icarus::SignalRegistry< Scalar >::get_config ( ) const
inlinenodiscard

Get all config info.

◆ get_config_for_component()

template<typename Scalar>
std::vector< SignalDescriptor > icarus::SignalRegistry< Scalar >::get_config_for_component ( const std::string & component_name) const
inlinenodiscard

Get config for a specific component.

◆ get_descriptor()

template<typename Scalar>
const SignalDescriptor * icarus::SignalRegistry< Scalar >::get_descriptor ( const std::string & name) const
inlinenodiscard

Get descriptor by name.

◆ get_inputs()

template<typename Scalar>
std::vector< SignalDescriptor > icarus::SignalRegistry< Scalar >::get_inputs ( ) const
inlinenodiscard

Get all input info.

◆ get_inputs_for_component()

template<typename Scalar>
std::vector< SignalDescriptor > icarus::SignalRegistry< Scalar >::get_inputs_for_component ( const std::string & component_name) const
inlinenodiscard

Get inputs for a specific component.

◆ get_integrable_signals()

template<typename Scalar>
std::vector< const SignalDescriptor * > icarus::SignalRegistry< Scalar >::get_integrable_signals ( ) const
inlinenodiscard

Get all integrable signal descriptors.

Returns descriptors for signals where is_integrable == true.

◆ get_outputs()

template<typename Scalar>
std::vector< SignalDescriptor > icarus::SignalRegistry< Scalar >::get_outputs ( ) const
inlinenodiscard

Get all output signal descriptors.

Returns only signals with kind != SignalKind::Input (i.e., actual outputs).

◆ get_outputs_for_component()

template<typename Scalar>
std::vector< SignalDescriptor > icarus::SignalRegistry< Scalar >::get_outputs_for_component ( const std::string & component_name) const
inlinenodiscard

Get output signals for a specific component.

Returns only signals with kind != SignalKind::Input for the component.

◆ get_params()

template<typename Scalar>
std::vector< SignalDescriptor > icarus::SignalRegistry< Scalar >::get_params ( ) const
inlinenodiscard

Get all parameter info.

◆ get_params_for_component()

template<typename Scalar>
std::vector< SignalDescriptor > icarus::SignalRegistry< Scalar >::get_params_for_component ( const std::string & component_name) const
inlinenodiscard

Get parameters for a specific component.

◆ get_state_pairs()

template<typename Scalar>
const auto & icarus::SignalRegistry< Scalar >::get_state_pairs ( ) const
inlinenodiscard

Get all integrable state pairs.

Returns pairs of (value_ptr, derivative_ptr) for building integration vectors. Used by StateManager::DiscoverStates().

◆ get_unwired_inputs()

template<typename Scalar>
std::vector< std::string > icarus::SignalRegistry< Scalar >::get_unwired_inputs ( ) const
inlinenodiscard

Get list of unwired input names.

◆ GetAllInputPaths()

template<typename Scalar>
std::vector< std::string > icarus::SignalRegistry< Scalar >::GetAllInputPaths ( ) const
inlinenodiscard

Get all declared input paths (for SignalRouter validation).

◆ GetAllOutputPaths()

template<typename Scalar>
std::vector< std::string > icarus::SignalRegistry< Scalar >::GetAllOutputPaths ( ) const
inlinenodiscard

Get all declared output paths (for SignalRouter validation).

◆ GetByName()

template<typename Scalar>
const Scalar & icarus::SignalRegistry< Scalar >::GetByName ( const std::string & name) const
inlinenodiscard

Get signal value by name (slow path, for debugging).

◆ GetDescriptors()

template<typename Scalar>
const std::deque< SignalDescriptor > & icarus::SignalRegistry< Scalar >::GetDescriptors ( ) const
inlinenodiscard

Get all signal descriptors.

◆ has_config()

template<typename Scalar>
bool icarus::SignalRegistry< Scalar >::has_config ( const std::string & name) const
inlinenodiscard

Check if a config exists.

◆ has_input()

template<typename Scalar>
bool icarus::SignalRegistry< Scalar >::has_input ( const std::string & name) const
inlinenodiscard

Check if an input exists.

◆ has_param()

template<typename Scalar>
bool icarus::SignalRegistry< Scalar >::has_param ( const std::string & name) const
inlinenodiscard

Check if a parameter exists.

◆ HasInput()

template<typename Scalar>
bool icarus::SignalRegistry< Scalar >::HasInput ( const std::string & name) const
inlinenodiscard

Check if an input port exists (PascalCase alias).

◆ HasOutput()

template<typename Scalar>
bool icarus::SignalRegistry< Scalar >::HasOutput ( const std::string & name) const
inlinenodiscard

Check if an output signal exists (PascalCase alias).

◆ HasSignal()

template<typename Scalar>
bool icarus::SignalRegistry< Scalar >::HasSignal ( const std::string & name) const
inlinenodiscard

Check if a signal exists.

◆ query()

template<typename Scalar>
std::vector< const SignalDescriptor * > icarus::SignalRegistry< Scalar >::query ( const std::string & pattern) const
inlinenodiscard

Query signals matching a pattern.

Parameters
patternRegex pattern to match signal names
Returns
Vector of pointers to matching descriptors
Exceptions
std::regex_errorif pattern is invalid

◆ register_config() [1/2]

template<typename Scalar>
void icarus::SignalRegistry< Scalar >::register_config ( const std::string & name,
bool * storage,
bool initial_value,
const std::string & description = "" )
inline

Register a bool config value.

◆ register_config() [2/2]

template<typename Scalar>
void icarus::SignalRegistry< Scalar >::register_config ( const std::string & name,
int * storage,
int initial_value,
const std::string & description = "" )
inline

Register an int config value.

◆ register_input()

template<typename Scalar>
template<typename T>
void icarus::SignalRegistry< Scalar >::register_input ( const std::string & name,
InputHandle< T > * handle,
const std::string & units = "",
const std::string & description = "" )
inline

Register an input port.

Inputs are declared at Provision and wired at Stage.

Template Parameters
TThe value type (Scalar, Vec3<Scalar>, etc.)
Parameters
nameLocal signal name
handlePointer to component-owned InputHandle
unitsPhysical units
descriptionHuman-readable description

◆ register_output()

template<typename Scalar>
template<typename T>
void icarus::SignalRegistry< Scalar >::register_output ( const std::string & name,
T * data_ptr,
const std::string & unit = "",
const std::string & description = "" )
inline

Register an output signal with pointer binding.

Template Parameters
TThe signal value type (must have TypeTraits specialization)
Parameters
nameSignal path
data_ptrPointer to component-owned storage
unitPhysical unit (optional)
descriptionHuman-readable description (optional)

◆ register_output_quat()

template<typename Scalar>
template<typename S>
void icarus::SignalRegistry< Scalar >::register_output_quat ( const std::string & name,
Vec4< S > * data_ptr,
const std::string & unit = "",
const std::string & description = "" )
inline

Register a Vec4/Quaternion output signal as four scalar components.

Creates four output signals with .w, .x, .y, .z suffixes.

◆ register_output_vec3()

template<typename Scalar>
template<typename S>
void icarus::SignalRegistry< Scalar >::register_output_vec3 ( const std::string & name,
Vec3< S > * data_ptr,
const std::string & unit = "",
const std::string & description = "" )
inline

Register a Vec3 output signal as three scalar components.

Creates three output signals with .x, .y, .z suffixes.

Template Parameters
SThe scalar type (typically same as Scalar template)
Parameters
nameBase signal path (e.g., "position")
data_ptrPointer to Vec3 storage
unitPhysical unit (optional)
descriptionHuman-readable description (optional)

◆ register_param()

template<typename Scalar>
void icarus::SignalRegistry< Scalar >::register_param ( const std::string & name,
Scalar * storage,
Scalar initial_value,
const std::string & units = "",
const std::string & description = "" )
inline

Register a parameter.

Parameters are Scalar-typed and can be optimization variables.

Parameters
nameLocal parameter name
storagePointer to component-owned Scalar storage
initial_valueInitial value
unitsPhysical units
descriptionHuman-readable description

◆ register_state()

template<typename Scalar>
template<typename T>
void icarus::SignalRegistry< Scalar >::register_state ( const std::string & name,
T * value,
T * derivative,
const std::string & unit = "",
const std::string & description = "" )
inline

Register a scalar state with its derivative.

Creates two signals: the state value (integrable) and its derivative. StateManager will discover these and build the integration vector.

Template Parameters
TThe scalar type
Parameters
nameState name (e.g., "altitude")
valuePointer to state value storage
derivativePointer to derivative storage
unitPhysical unit
descriptionHuman-readable description

◆ register_state_quat()

template<typename Scalar>
template<typename S>
void icarus::SignalRegistry< Scalar >::register_state_quat ( const std::string & name,
Vec4< S > * value,
Vec4< S > * derivative,
const std::string & unit = "",
const std::string & description = "" )
inline

Register a quaternion state with its derivative.

Creates 8 signals: 4 for value (.w/.x/.y/.z) and 4 for derivative (_dot.w/.x/.y/.z).

◆ register_state_vec3()

template<typename Scalar>
template<typename S>
void icarus::SignalRegistry< Scalar >::register_state_vec3 ( const std::string & name,
Vec3< S > * value,
Vec3< S > * derivative,
const std::string & unit = "",
const std::string & description = "" )
inline

Register a Vec3 state with its derivative.

Creates 6 signals: 3 for value (.x/.y/.z) and 3 for derivative (_dot.x/.y/.z).

◆ RegisterSignal()

template<typename Scalar>
SignalIndex icarus::SignalRegistry< Scalar >::RegisterSignal ( const SignalDescriptor & descriptor)
inline

Register a new signal output (legacy API).

Deprecated
Use register_output<T>() instead for pointer-based registration

Called during Provision phase to declare a signal. Creates internal storage managed by the registry.

Parameters
descriptorSignal metadata
Returns
Index for fast access during Step

◆ Resolve()

template<typename Scalar>
SignalIndex icarus::SignalRegistry< Scalar >::Resolve ( const std::string & name) const
inlinenodiscard

Resolve a signal by name (legacy API).

Deprecated
Use resolve<T>() for type-safe handle-based access
Parameters
nameFull signal path
Returns
Index for fast access during Step

◆ resolve()

template<typename Scalar>
template<typename T>
SignalHandle< T > icarus::SignalRegistry< Scalar >::resolve ( const std::string & name)
inlinenodiscard

Resolve a signal by name and return a type-safe handle.

Template Parameters
TThe expected signal value type
Parameters
nameSignal path
Returns
SignalHandle<T> for zero-overhead access
Exceptions
SignalNotFoundErrorif signal doesn't exist
TypeMismatchErrorif type doesn't match registered type

◆ resolve_const()

template<typename Scalar>
template<typename T>
SignalHandle< const T > icarus::SignalRegistry< Scalar >::resolve_const ( const std::string & name) const
inlinenodiscard

Resolve a signal as const (for read-only access).

◆ resolve_quat()

template<typename Scalar>
template<typename S>
QuatHandle< S > icarus::SignalRegistry< Scalar >::resolve_quat ( const std::string & name)
inlinenodiscard

Resolve a quaternion signal as a QuatHandle.

◆ resolve_vec3()

template<typename Scalar>
template<typename S>
Vec3Handle< S > icarus::SignalRegistry< Scalar >::resolve_vec3 ( const std::string & name)
inlinenodiscard

Resolve a Vec3 signal as a Vec3Handle.

Template Parameters
SThe scalar type
Parameters
nameBase signal path (without .x/.y/.z suffix)
Returns
Vec3Handle with handles for each component

◆ Set()

template<typename Scalar>
void icarus::SignalRegistry< Scalar >::Set ( SignalIndex index,
const Scalar & value )
inline

Set signal value by index (hot path, legacy).

Deprecated
Use SignalHandle<T> for direct pointer access

◆ set_current_component()

template<typename Scalar>
void icarus::SignalRegistry< Scalar >::set_current_component ( const std::string & name)
inline

Set the current component context for registration.

All signals registered after this call will be attributed to this component.

Parameters
nameComponent name

◆ SetByName()

template<typename Scalar>
void icarus::SignalRegistry< Scalar >::SetByName ( const std::string & name,
const Scalar & value )
inline

Set signal value by name (slow path, for initialization).

◆ Size()

template<typename Scalar>
std::size_t icarus::SignalRegistry< Scalar >::Size ( ) const
inlinenodiscard

Get number of registered signals.

◆ validate_wiring()

template<typename Scalar>
void icarus::SignalRegistry< Scalar >::validate_wiring ( ) const
inline

Validate all inputs are wired.

Exceptions
WiringErrorwith list of unwired inputs

◆ wire_input()

template<typename Scalar>
template<typename T>
void icarus::SignalRegistry< Scalar >::wire_input ( const std::string & input_name,
const std::string & source_name )
inline

Wire an input to a source signal.

Parameters
input_nameFull name of the input port
source_nameFull name of the source signal
Exceptions
SignalNotFoundErrorif source doesn't exist
WiringErrorif input not found or source is an input (not a valid wiring source)

◆ wire_input_with_gain() [1/2]

template<typename Scalar>
void icarus::SignalRegistry< Scalar >::wire_input_with_gain ( const std::string & input_name,
const std::string & source_name,
double gain = 1.0 )
inline

Wire an input with gain (type-erased version).

Uses the input's registered type information to perform wiring. Only supports Scalar type - gain wiring is not applicable to vector types.

Exceptions
WiringErrorif input type is not Scalar

◆ wire_input_with_gain() [2/2]

template<typename Scalar>
template<typename T>
void icarus::SignalRegistry< Scalar >::wire_input_with_gain ( const std::string & input_name,
const std::string & source_name,
double gain = 1.0 )
inline

Wire an input to a source signal with gain factor.

The gain is applied when reading the input value. gain = 1.0 means no scaling (pass-through).

Parameters
input_nameFull name of the input port
source_nameFull name of the source signal
gainScale factor (default 1.0)
Exceptions
WiringErrorif input not found or source is an input (not a valid wiring source)

Member Data Documentation

◆ InvalidIndex

template<typename Scalar>
SignalIndex icarus::SignalRegistry< Scalar >::InvalidIndex = static_cast<SignalIndex>(-1)
staticconstexpr

The documentation for this class was generated from the following files: